cd 래퍼를 작성할 때 cd“$ 1”대신 cd“$ @”를 사용해야하는 이유는 무엇입니까?


25

다른 곳에서는 다음과 같이 cd 함수를 보았습니다.

cd()
{
 builtin cd "$@"
}

$@대신에 사용하는 것이 좋습니다 $1?

테스트 디렉토리 "r st"를 작성하고이 함수를 포함하는 스크립트를 호출했으며 어느 쪽이든 작동했습니다.

$ . cdtest.sh "r st"

하지만 $ . cdtest.sh r st내가 사용 "$@"하든 또는 실패하든"$1"


1
cd "$*"또한 1 개 이상의 인수로 올바르게 작동하지 않습니다.
GoFundMonica-codidact.org

답변:


57

에 따르면 bash(1), cd인수 를 취하기 때문에

   cd [-L|[-P [-e]] [-@]] [dir]
          Change  the  current  directory to dir.  if dir is not supplied,
          ...

따라서 디렉토리는 실제로 또는 다른 플래그 $1와 같은 옵션 일 수 있으므로 실제로 디렉토리에 없을 수 있습니다 -L.

이것이 얼마나 나쁩니 까?

$ cd -L /var/tmp
$ pwd
/var/tmp
$ cd() { builtin cd "$1"; }
$ cd -L /var/tmp
$ pwd
/home/jhqdoe
$ 

당신이 사용하지 않을 것으로 예상되면 상황은 매우 엉망이 될 수 있습니다 cd "$1"...


19

를 사용 "$@"하면 모든 인수를 첫 번째 인수 만 전달하는 cd위치로 $1전달합니다.

당신의 예에서

$ . cdtest.sh "r st"

하나의 인수 만 전달해도 항상 작동하지만 다음과 같이 플래그를 전달해야하는 경우

$ . cdtest.sh -L "r st"

"$@"제대로 실행 곳 "$1"으로 확대 할 cd -L전체 디렉토리를 잃고.

하나

$ . cdtest.sh r st

cd에 두 개의 매개 변수를 전달할 때 두 경우 모두 실패 r하며 st이는 cd를 실행하는 올바른 방법이 아닙니다. 매개 변수는 공백으로 구분되며, 첫 번째 예제와 같이 따옴표로 묶거나 이스케이프 ( r\ st)해야 하나의 인수로 취급됩니다.

CD의 경우 그러나 플래그를 전달하는 것은 매우 드문 일이며 중 하나 현실 세계의 사용의 차이를 볼 수 없습니다 있도록 여러 디렉토리에 전달할 수 없습니다 "$1"또는 "$@"CD에 있습니다. 그러나 다른 명령에 대한 당신 것입니다 항상 사용하는 것이 좋습니다 있도록 차이를 느낄 "$@"이 같은 래퍼 함수 나 스크립트를 만들려는 경우가.


14

인수가 없는 경우도 있습니다 .

$ cd /tmp; cd; pwd
/home/muru
$ cd_func() { builtin cd "$1"; }
$ cd_func /tmp; cd_func; pwd
/tmp

cd인수없이 홈 디렉토리로 변경됩니다. 인수가 없으면 "$@"아무것도 확장되지 않지만 "$1"빈 문자열로 확장됩니다. 이것들은 다릅니다 :

$ args() { for i in "$@"; do echo "|$i|"; done; }
$ args
$ args ""
||

다소 관련이 없지만 null 인수 cd가 좋은 이유를 마침내 이해 합니다. 홈 디렉토리로 변경하는 대신 오류가 발생합니다. 특히 다른 명령을 사용하면 rsyncnull 첫 번째 인수가 예기치 않은 동작을 유발합니다 (전송 소스에 현재 디렉토리 포함).
Joe

4

bash 스크립트에 대한 인수는 공백으로 구분됩니다. 첫 번째 인수는 $ 1입니다. 귀하의 예에서 ...

예 1에서 $ 1은 문자열 "r st"... 두 번째 예에서 $ 1은 하나의 문자열 'r'...입니다.

$ @는 모든 주장입니다.

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