답변:
에 따르면 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"
...
를 사용 "$@"
하면 모든 인수를 첫 번째 인수 만 전달하는 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에 있습니다. 그러나 다른 명령에 대한 당신 것입니다 항상 사용하는 것이 좋습니다 있도록 차이를 느낄 "$@"
이 같은 래퍼 함수 나 스크립트를 만들려는 경우가.
인수가 없는 경우도 있습니다 .
$ 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 ""
||
cd
가 좋은 이유를 마침내 이해 합니다. 홈 디렉토리로 변경하는 대신 오류가 발생합니다. 특히 다른 명령을 사용하면 rsync
null 첫 번째 인수가 예기치 않은 동작을 유발합니다 (전송 소스에 현재 디렉토리 포함).
cd "$*"
또한 1 개 이상의 인수로 올바르게 작동하지 않습니다.