우분투 17.04 — bash : cd : 너무 많은 인수


10

방금 Ubuntu 16.04를 17.04로 업그레이드하고 cd명령에 약간의 문제가 있음을 발견했습니다 .

두 개의 폴더가 있다고 가정 해 봅시다. album-01&album-02

우분투 16.04에서 내가 cd album*하면 첫 번째 폴더로 이동합니다album-01

그러나 새로운 우분투 17.04에서 내가 그렇게 cd album*하면 결과 가 나옵니다 . -bash: cd: too many arguments

우분투 16.04에서 cd와 같이 우분투 17.04에서 만드는 방법 cd?


4
당신이 얻는 것은 cd두 장소 를 제공함에 따라 의미가 있으며 어떻게 든 원하는 위치를 알아낼 것으로 기대합니다.
mikewhatever

1
@mikewhatever 불행히도, Bash 매뉴얼 은 당신과 동의하지 않습니다 : " 디렉토리 다음에 오는 추가 인수 는 무시됩니다"
muru

3
누군가 관심이있는 경우를 대비하여 버그 보고서를 게시했습니다. bugs.launchpad.net/ubuntu/+source/bash/+bug/1683576
muru

질문이 만족스럽게 해결되면 왼쪽에있는 회색 둥근 확인 버튼을 클릭하여 가장 도움이되는 답변을 수락하는 것을 잊지 마십시오.
바이트 사령관

답변:


9

실제 17.04 시스템에서 이것을 테스트 할 수는 없지만 (16.04에서 작동하는지 확인한 경우에만), cd사용자 정의 함수로 Bash 내장 명령 을 무시할 수 있어야합니다. :

cd(){ command cd "$1" ; }

업데이트 : @ muru 's comment 에서 제안한 것처럼 아래 버전은 더 잘 작동하고 cd인수없이 호출 을 지원합니다 .

cd(){ builtin cd "${@:1:1}"; }

터미널에이 줄을 입력 한 후 cd원하는 방식으로 동작 하는지 확인하십시오 . 이 경우 ~/.bashrc파일 끝에 해당 행을 추가하여이 함수 정의를 지속적으로 만들 수 있습니다. 그렇지 않으면 현재 셸 세션을 종료하자마자 사라집니다.

어떤 이유로 든 cd이 사용자 정의 함수 대신 실제 Bash 내장 명령 을 일시적으로 사용해야하는 경우 command cdplain 대신 간단히 호출 할 수 있습니다 cd.


나는 확실히 그것을 작동 ... 대신 내가 작은 스크립트 별칭을 제안 된 기능으로, 같은 일을 기록했다)
Ravexina

@Ravexina 나는 또한 별칭을 먼저 사용하는 것을 고려했지만 별칭을 사용할 수 없다고 생각하기 때문에 인수를 제어 할 수 없기 때문에 그것을 떨어 뜨 렸습니다. 호기심에서, 당신은 어떤 접근법을 제안 했습니까?
바이트 사령관

나는 똑같은 일을했다. 코드를 .sh파일 에 넣고 다음과 같은 별칭을 만들었다.mcd="source /home/user/bin/cd.sh"
Ravexina

그래. 그것은 필요한 것보다 조금 더 복잡하지만 잘 작동해야합니다.
바이트 사령관

2
@SandiHidayat cd () { builtin cd "${@:1:1}"; }대신 사용해보십시오 .
muru

7

짧은 답변 / 해결 방법

이 정확한 경우에 귀하의 질문에 대답하기 위해, 이것은 작동합니다

cd album*1

그러나 실제로 원하는 기능이 아닐 수도 있습니다.

무엇이 바뀌 었습니까?

config-top.hBash-4.4에서 다음 옵션을 추가하도록 업데이트 된 것으로 보입니다

/* Define CD_COMPLAINS if you want the non-standard, but sometimes-desired
   error messages about multiple directory arguments to `cd'. */

#define CD_COMPLAINS

그리고 builtins/cd.def여기에 오류가 있습니다 :

#if defined (CD_COMPLAINS)
  else if (list->next)
    {
      builtin_error (_("too many arguments"));
      return (EXECUTION_FAILURE);
    }
#endif

장기적으로 무엇을 할 수 있습니까? :

bash새로운 CD_COMPLAINS 없이 직접 컴파일 할 수는 있지만 지루할 것입니다. cd여기에 제안 된 기능을 재정의 하거나 다음과 같은 기능의 별칭을 지정할 수 있습니다

cd "$(find $1* | head -1)"

그것을 증명

여전히 작동하는 Bash 4.4 베타

#Pulling and unpacking source
$ wget https://ftp.gnu.org/gnu/bash/bash-4.4-beta.tar.gz
$ tar -xzvf bash-4.4-beta.tar.gz
$ cd bash-4.4-beta

#Building, go grab something to drink. It's gonna be a while.
~/bash-4.4-beta$ ./configure
~/bash-4.4-beta$ make

#Check Version
~/bash-4.4-beta$ ./bash --version
GNU bash, version 4.4.0(1)-beta (x86_64-unknown-linux-gnu)

#Enter a clean interactive prompt
~/bash-4.4-beta$ env -i PATH="$PWD:$PATH" ./bash --noprofile --norc

#Test example
bash-4.4$ mkdir album-0{1..2}
bash-4.4$ cd album* && pwd
/home/gkent/bash-4.4-beta/album0-1

작동하지 않는 Bash 4.4 안정 릴리스

#Pulling and unpacking source
$ wget https://ftp.gnu.org/gnu/bash/bash-4.4.tar.gz
$ tar -zxvf bash-4.4.tar.gz
$ cd bash-4.4/

#Building, go grab something to drink. It's gonna be a while.
~/bash-4.4$ ./configure
~/bash-4.4$ make

#Check Version
~/bash-4.4$ ./bash -version
GNU bash, version 4.4.0(1)-release (x86_64-unknown-linux-gnu)

#Enter a clean interactive prompt
~/bash-4.4$ env -i PATH="$PWD:$PATH" ./bash --noprofile --norc

#Test example
bash-4.4$ mkdir album-0{1..2}
bash-4.4$ cd album*
bash: cd: too many arguments

죄송합니다. 오타였습니다. 답변이 업데이트되었습니다.
Grayson Kent

아 맞아 대괄호 없이도 끝에 cd alb*1리터럴을 일치시키기 위해 할 수 1있습니다. 나는 당신의 생각을 처음에는 다른 것과 혼동했습니다.
ilkkachu

5

항상 탭 완성을 사용 하므로이 문제가 발생하지 않았습니다 .

따라서 귀하의 경우, 내가 원하는 디렉토리에 대해 부정확 한 추측을하기보다는 cd alTab일치하는 항목이 하나만 있으면 완료하고 2 개 이상의 완료가 있으면 일치하는 항목이 끝나고 TabTab선택 사항이 나열됩니다.

내 시스템의 예는 다음과 같습니다.

cd Un Tab

cd Unknown

뒤이어 TabTab농산물

Unknown/                        Unknown Artist - Unknown Album/ 

2

이것은 Bash의 버그처럼 보입니다 man builtins. 이전 동작이 올바른 것입니다.

   cd [-L|[-P [-e]] [-@]] [dir]
              Change the current directory to dir.  if dir is not supplied,
              the  value  of  the  HOME shell variable is the default.  Any
              additional arguments following dir are ignored.

bug-bash메일 링리스트 에서 버그를보고 할 수 있습니다 . 자세한 내용은 여기를 참조 하십시오 .


실제로, 버그는 (오래 전에)보고되었습니다. 지금 고정 배쉬를 원하는 경우에, 지금, 지금 , 여기 (17.10 테스트뿐만 아니라 다른 사람에 작동합니다) 제대로하는 방법입니다.

먼저 작업 할 디렉토리를 작성하십시오 (예 :

mkdir ~/bash
cd ~/bash

소스 패키지와 빌드 종속성을 가져옵니다.

apt-get source bash
sudo apt-get build-dep bash
cd bash-4.4

config-top.h이것을 변경하려면 편집 하십시오 (32 행이어야 함)

#define CD_COMPLAINS

이에

/* #define CD_COMPLAINS */

debian/changelog상단에 이와 같은 항목을 편집 하고 추가하십시오 (명령을 사용할 수도 있습니다 dch -i).

bash (4.4-5ubuntu1+cd) artful; urgency=medium

  * Fix cd.

 -- Firas Kraiem <firas@fkraiem.org>  Thu, 04 Jan 2018 21:11:22 +0900

가장 중요한 점은 현재 버전 번호 에 추가 +foo하는 것 입니다 (소문자로 된 문자열 일 수 있습니다.를 사용하는 경우주의 하십시오. 올바른 출시 이름 ( 여기). 마지막으로을 실행하십시오 .foodch -iartfuldpkg-source --commit

그런 다음 debuild명령 을 실행할 수 있으며 모든 것이 잘되면 (오류는 debsign무시할 수 있음) .deb부모 디렉토리에 s가 있어야합니다.이 디렉토리는 평소와 같이 설치할 수 있습니다 (모두 설치 할 필요는 없습니다) 지금 사용하십시오 dpkg -l | grep bash.)

새 패키지의 버전 번호는 향후 업데이트를 자동으로 받도록 설정되어 있습니다 bash. 업데이트로 문제가 해결되지 않으면 위의 과정을 반복해야합니다.

(이 답변은 이 중복 질문 에 처음 게시되었습니다 .)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.