디렉토리에 CD를 넣지 않고 주어진 디렉토리에서 특정 명령을 실행하시겠습니까?

디렉토리에 CD를 넣지 않고 주어진 디렉토리에서 특정 명령을 실행하시겠습니까?

명령을 실행 하지 않고도 다른 디렉터리에서 명령을 실행할 수 있는 방법이 있습니까 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 덕분에 약간 단축된 버전)

관련 정보