명령을 실행 하지 않고도 다른 디렉터리에서 명령을 실행할 수 있는 방법이 있습니까 cd
? 간단히 cd
들어오고 나갈 수 있다는 것을 알고 있지만 cd
추가 단계를 포기할 가능성에만 관심이 있습니다. :)
답변1
이것이 중요한지는 모르겠지만 하위 쉘을 만들 수 있습니다.
$ (cd /var/log && cp -- *.log ~/Desktop)
cd -
디렉토리는 해당 서브셸에 대해서만 변경되므로 나중에 수행해야 하는 작업을 피할 수 있습니다.
답변2
다른 사람이 제공하는 답변의 가치를 훼손하지 않고 원하는 것을 믿습니다.이것은:
(cd /path/to && ./executable [ARGS])
cd
서브셸 내에서 호출될 괄호에 유의하세요.
답변3
일부 프로그램에는 사용자가 알릴 수 있는 옵션이 있습니다.목차(2)자체(예: GNU아스팔트의 -C
/ --directory
).
그러나 이러한 계획 외에도 몇 가지 조치를 취해야 합니다.목차. 쉘이 수행하도록 하는 대신 일종의 컴파일된 "바이너리" 프로그램을 작성하고 사용할 수 있지만 아마도 그다지 좋은 결과를 얻지 못할 것입니다.
다른 답변에 대한 의견에서 다음과 같은 예를 제시했습니다.
execindirectory -d /var/log "cp *.log ~/Desktop"
*.log
스키마는 쉘 자체에 의해 확장되므로 (CP), 몇 가지 사항은 다음과 같습니다.목차쉘이 명령을 평가하도록 하기 전에 이 디렉토리로 이동하십시오.
"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
# which it concatenates
# with spaces prior to
# evaluation
runindir /var/log cp -- \*.log ~/Desktop# 예아니요물결표를 먼저 확장할 수 있습니다. #확장된 결과는 # 쉘 코드로 해석되며 # $HOME에 다음이 포함되어 있으면 깨질 것입니다. # 쉘 특정 문자.
답변4
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 덕분에 약간 단축된 버전)