답변:
특정 작업 디렉토리로 명령을 실행하려면 일반적으로
( 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 "$@" ).