[linux] bash-어떤 명령에서 cd로 결과를 파이프하는 방법

which명령 의 결과를 어떻게 파이프 할 수 cd있습니까?

이것이 내가하려는 것입니다.

which oracle | cd
cd < which oracle

그러나 그들 중 어느 것도 작동하지 않습니다.

이를 달성하는 방법이 있습니까 (물론 복사 / 붙여 넣기 대신)?

편집 : 다시 생각하면 대상 파일이 폴더 / 디렉토리가 아니기 때문에이 명령이 실패합니다 .

그래서 나는 지금 후행 “/ oracle”부분 (sed 또는 awk, 심지어 Perl)을 제거하는 더 나은 방법을 생각하고 있습니다. 🙂

편집 : 좋아 그게 결국 내가 가진 것입니다.

cd `which oracle | sed 's/\/oracle//g'`



답변

명령이 표준 입력에서 매개 변수를 예상하는 경우 파이프를 사용합니다. (이에 대해 더 알아보기 ).

함께 cd명령 있다는 사실이 아니다. 디렉토리는 명령 인수입니다. 이 경우 명령 대체를 사용할 수 있습니다. 백틱을 사용하거나 $(...)명령을 평가하려면 변수에 저장합니다.

path=`which oracle`
echo $path # just for debug
cd $path

훨씬 더 간단한 방법으로 수행 할 수 있습니다.

cd `which oracle`

또는 경로에 특수 문자가있는 경우

cd "`which oracle`"

또는

cd $(which oracle)

이는 백틱 표기법과 동일하지만 권장됩니다 (백틱은 아포스트로피와 혼동 될 수 있음).

..하지만 원하는 것 같습니다.

cd $(dirname $(which oracle))

(네 스팅을 쉽게 사용할 수 있음을 보여줍니다)

$(...) (백틱도 포함) 큰 따옴표로 묶인 문자열에서도 작동하므로 결과에 공백이 포함될 수 있습니다.

cd "$(dirname "$(which oracle)")"

(두 출력 모두 큰 따옴표 세트가 필요합니다.)


답변

디렉토리를 얻으려면 dirname을 사용하십시오.

cd $(which oracle | xargs dirname)

편집 : 공백이 포함 된 경로에주의하십시오. 아래 @anishpatel 주석을 참조하십시오.


답변

cd `which oracle`

백틱 (일반적으로 미국 키보드에서 1의 왼쪽에있는 키)입니다.


답변

좋아, 여기에 올바른 인용을 사용하는 솔루션이 있습니다.

cd "$(dirname "$(which oracle)")"

백틱을 피하고 가독성이 떨어지며 항상 프로세스 대체를 인용하십시오.


답변

파이프가 필요하지 않습니다. Bash 매개 변수 확장을 사용하여 원하는 것을 할 수 있습니다!

추가 팁 : Bash를 사용하는 경우 외부 “which”명령 대신 “type -P”를 사용합니다.

# test
touch /ls
chmod +x /ls
cmd='ls'
PATH=/:$PATH
if cmdpath="$(type -P "$cmd")" && cmdpath="${cmdpath%/*}" ; then
   cd "${cmdpath:-/}" || { echo "Could not cd to: ${cmdpath:-/}"; exit 1; }
else
   echo "No such program in PATH search directories: ${cmd}"
   exit 1
fi


답변

편집 한 질문에 대한 응답으로 다음을 사용하여 명령 이름을 제거 할 수 있습니다 dirname.

cd $(dirname `which oracle`)


답변

위의 좋은 대답 외에도 cd 는 명령 인 ls 와 같은 새 프로세스 이외의 동일한 프로세스에서 실행되는 쉘 내장형이라는 것 입니다.

  1. /unix/50022/why-cant-i-redirect-a-path-name-output-from-one-command-to-cd

  2. http://en.wikipedia.org/wiki/Shell_builtin