답변:
이것이 중요한지 모르겠지만 서브 쉘을 만들 수 있습니다.
$ (cd /var/log && cp -- *.log ~/Desktop)
디렉토리는 해당 서브 쉘에 대해서만 변경되므로 cd -
나중에 수행 할 필요가 없습니다 .
$ (cd /var/log && cp *.log ~/Desktop)
. 이렇게하면 디렉토리가 존재하지 않으면 더 이상 명령이 실행되지 않습니다.
일부 프로그램에는 chdir (2) 자신 에게 알려줄 수있는 옵션이 있습니다 (예 : GNU tar s -C
/ --directory
).
그러나 그러한 프로그램 외에는 무언가 chdir 해야합니다 . 쉘을 사용하는 대신 일종의 컴파일 된“이진”프로그램을 작성하고 사용할 수 있지만 많은 이점을 얻지는 못할 것입니다.
다른 답변의 의견에서 예를 들어 보겠습니다.
execindirectory -d /var/log "cp *.log ~/Desktop"
때문에 *.log
패턴이 쉘 자체 (하지 않음으로써 확장 CP ), 뭔가를해야합니다 CHDIR 쉘을 가진 전에 디렉토리로 명령을 평가합니다.
“cd back”을 피하는 데 관심이 있다면 서브 쉘을 사용하여 CD 의 효과를 작업 쉘 인스턴스에서 분리 할 수 있습니다 .
(cd /path/to/dir && some command)
이것을 쉘 함수로 패키지 할 수 있습니다. ( -d
디렉토리가 실제로 선택적인 경우이 명령을 거의 가리지 않으므로 예제 사용법에서 옵션을 삭제했습니다 .)
runindir() { (cd "$1" && shift && eval "$@"); }
runindir /var/log 'cp *.log ~/Desktop' # your example
runindir /var/log cp \*.log \~/Desktop # eval takes multiple args
runindir /var/log cp \*.log ~/Desktop # it is okay to expand tilde first
다른 사람들이 제공 한 답변의 가치를 훼손하지는 않지만 원하는 것은 다음과 같습니다.
(cd /path/to && ./executable [ARGS])
cd
하위 쉘에서 호출 할 Parens에 유의하십시오 .
cd
잊어 버리지 않는 것이 질문의 목적인 것처럼 보이기 때문에 Bash를 사용하여 현재 위치로 되돌려 놓을 수있는 것이 있습니다.
# Save where you are and cd to other dir
pushd /path/to/dir/that/needs/to/be/current/dir
run-your-command
# Get back where you were at the beginning.
popd
(편집 : @ Random832 덕분에 약간 짧은 버전)
pushd other-dir
오히려, 오히려 할 수 있습니다pushd .; cd other-dir
슬프게도, 당신의 예 :
execindirectory -d /var/log "cp *.log ~/Desktop"
디렉토리를 변경할 필요가 없습니다.
cp /var/log/*.log ~/Desktop
똑같이 할 것입니다. 실제 문제에 더 가까이 갈 수 없습니까? 우리는 그에 대한 더 나은 해결책을 알고 있기 때문입니다.
Michaels 솔루션의 우아함에서 멀리 떨어져있는 문제를 해결하는 복잡한 방법은 find를 사용하는 것입니다. find는 파일이있는 디렉토리에서 '-execdir'스위치를 수행합니다. 귀하의 모범에 잘못 채택되었습니다.
find /var/log -maxdepth 1 -type f -name "*.log" -execdir echo cp {} ~/Desktop ";"
실제 문제에 유용 할 수 있습니다. -execdir 대신 -okdir에서 모든 호출을 확인하도록 요청합니다.
-okdir 및 -execdir은 일반적으로 Linux에서 사용되는 gnu-find를 설치해야 할 수도 있습니다.
어때요 ./your/path/command.sh
?
execindirectory -d /var/log "cp *.log ~/Desktop"
였습니다..
echo "#!/bin/bash; cd $1; exec $2" > /usr/local/bin/execindirectory; chmod +x /usr/local/bin/execindirectory
입니다. 옵션과 같은 옵션 "태그"를 실제로 지원하려면 약간의 노력을 기울여야 할 수도 있습니다-d
.