주어진 디렉토리에서 cd ​​명령없이 특정 명령을 실행 하시겠습니까?


42

다른 디렉토리에서 명령을 실행할 필요가없는 방법 cd이 있습니까? 나는 내가 간단하게 할 수 알고 cdcd출력,하지만 난 그냥 추가 단계를 삼가고의 가능성에 관심이 있어요 :)


다음과 같은 작업을 수행하는 스크립트를 작성하는 것은 사소한 일 echo "#!/bin/bash; cd $1; exec $2" > /usr/local/bin/execindirectory; chmod +x /usr/local/bin/execindirectory입니다. 옵션과 같은 옵션 "태그"를 실제로 지원하려면 약간의 노력을 기울여야 할 수도 있습니다 -d.
LawrenceC

답변에서 사용자 알 수없는 상태로 여기에 제공 한 모든 예제와 다른 의견은 다른 솔루션으로 더 잘 처리되므로 실제로 해결해야 할 문제가 있는지 확실하지 않습니다. 더 좋은 예를 생각해 낼 수 있습니까?
Caleb

답변:


55

이것이 중요한지 모르겠지만 서브 쉘을 만들 수 있습니다.

$ (cd /var/log && cp -- *.log ~/Desktop)

디렉토리는 해당 서브 쉘에 대해서만 변경되므로 cd -나중에 수행 할 필요가 없습니다 .


2
그것이 제가 보통하는 일입니다.
Adam Byrtek

니스, 나는 서브 쉘에 대해 완전히 잊어 버렸습니다.이 경우 매우 편리합니다.
Naftuli Kay

4
혼돈을 피하려면 세미콜론을 두 개의 앰퍼샌드로 빼십시오 $ (cd /var/log && cp *.log ~/Desktop). 이렇게하면 디렉토리가 존재하지 않으면 더 이상 명령이 실행되지 않습니다.
Naftuli Kay

저처럼 순진한 다른 사람들을 위해 주목하십시오 : 시작시 $는 명령의 일부가 아니며 그 이후의 모든 것입니다.
Maltronic

14

일부 프로그램에는 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

2
개인적으로 푸시 / 팝을 사용한다는 점을 제외 하고는이 솔루션을 좋아합니다.
NJ

10

다른 사람들이 제공 한 답변의 가치를 훼손하지는 않지만 원하는 것은 다음과 같습니다.

(cd /path/to && ./executable [ARGS])

cd하위 쉘에서 호출 할 Parens에 유의하십시오 .


나는 그렇게 생각하지 않습니다. 알다시피, 그는 초기 디렉토리에 들어가기를 원합니다.
Adam Byrtek

아, 나는 그것을 하위 쉘로 감싸는 것을 완전히 잊었습니다. 내 대답을 수정했습니다. 감사합니다.
alex

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 덕분에 약간 짧은 버전)


1
당신은 pushd other-dir오히려, 오히려 할 수 있습니다pushd .; cd other-dir
Random832

@ Random832, 좋은 지적!
Bruno

2

슬프게도, 당신의 예 :

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를 설치해야 할 수도 있습니다.


1

어때요 ./your/path/command.sh?


아니요, 실제로 다음과 같은 의미 execindirectory -d /var/log "cp *.log ~/Desktop"였습니다..
Naftuli Kay

나는 이것이 꼭 필요한 것은 아니라는 것을 완벽하게 알고 있습니다. 실제로 그것이 실제로 이루어질 수 있는지에 관심이 있습니다.
Naftuli Kay
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.