답변:
특정 작업 디렉토리로 명령을 실행하려면 일반적으로
( cd directory && utility )
괄호 안의 cd ...
의미는 명령이 서브 쉘에서 실행됨을 의미합니다. 서브 쉘에서 작업 디렉토리를 변경하면 호출 쉘의 현재 작업 디렉토리가 변경되지 않습니다. 즉,이 명령을 호출 한 후에도 시작한 동일한 디렉토리에 여전히 있습니다.
예:
( cd / && echo "$PWD" ) # will output "/"
echo "$PWD" # will output whatever directory you were in at the start
별명은 인수를 사용할 수 없으므로 일반 별명으로 전환 할 수 없습니다.
A에 대한 특정의 디렉토리와 유틸리티, 하나는 할 수
alias cdrun='( cd "$HOME/somedir" && ./script.sh )'
그러나 일반적인 경우에는 셸 함수를 사용해야합니다.
cdrun () {
( cd "$1" && shift && command "$@" )
}
또는
cdrun () (
cd "$1" && shift && command "$@"
)
중괄호를 함수 본문 주위의 괄호로 바꾸면 함수가 자체 서브 쉘에서 실행됩니다.
이것은 다음과 같이 사용됩니다
$ cdrun "$HOME/somedir" ./script.sh
이는 스크립트 실행됩니다 script.sh
디렉토리에 위치를 $HOME/somedir
함께 $HOME/somedir
작업 디렉토리로, 또는
$ cdrun / ls -l
루트 디렉토리의 "긴 형식"으로 된 디렉토리 목록을 제공합니다.
쉘 함수는 첫 번째 인수를 취하여 해당 디렉토리로 변경하려고 시도합니다. 작동하면 디렉토리 이름을 위치 매개 변수 (명령 행 인수 목록)에서 벗어나 나머지 인수가 제공하는 명령을 실행합니다. command
쉘에 내장 된 명령으로 단순히 인수를 명령으로 실행합니다.
변경된 작업 디렉토리로 명령을 실행하려면이 모든 것이 필요합니다 . 다른 곳에서 명령을 실행하려면 분명히 사용할 수 있습니다.
alias thing='$HOME/somedir/script.sh'
하지만이 실행됩니다 script.sh
에 위치한 $HOME/somedir
와 현재 작업 디렉토리와 같은 디렉토리입니다.
작업 디렉토리를 변경하지 않고 다른 곳에 위치한 스크립트를 실행하는 또 다른 방법은 스크립트의 위치를 PATH
환경 변수 에 추가하는 것입니다.
PATH="$PATH:$HOME/somedir"
이제는 다음 script.sh
을 $HOME/somedir
사용하여 어디에서나 실행할 수 있습니다.
$ script.sh
이 명령의 작업 디렉토리는 변경 되지 않습니다 .
{ ... }
더 긴 기능과 일관성을 유지 하기 위해 사용 합니다.
pushd
하고 popd
( > /dev/null
출력 메시지도 피하려고하는 경우에도) 컨텍스트를 깨끗하게 유지하면서 개선 될 수 있습니다 !
(cd dir && thing)
훨씬 더 휴대용 사용하는 것보다 pushd
하고 popd
.
이 기능을 사용하여 다른 디렉토리에서 단일 명령을 실행합니다.
cd1 () {
if [ $# -eq 1 ]; then
command cd -- "$1"
else
( command cd -- "$1" && shift && "$@" )
fi
}
이 기능의 제한 사항은 와일드 카드가 명령이 실행되는 디렉토리가 아닌 원래 디렉토리를 기준으로 완료된다는 것입니다. zsh에서 더 잘 수행 할 수 있습니다 .
이 함수는 cd
단일 인수로 호출 하면 일반처럼 작동 하므로 호출 할 수 cd
있습니다. 이 기능은 옵션을 지원하지 않지만 cd
거의 사용되지 않는 옵션 입니다.
세미콜론으로 명령을 구분하십시오 (예 :
alias do_something='cd /tmp; ls'
cd
실패, 잘못된 디렉토리의 디렉토리 목록을 얻을 것입니다. 여기 &&
대신 사용 하는 것이 좋습니다 ;
.
cdrun () ( cd "$1" && shift && command "$@" )
.