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


87

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

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

which oracle | cd
cd < which oracle

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

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

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

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

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

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

2
어떤주는 당신은하지 디렉토리 명령
Anycorn

프로그램이 설치된 디렉토리를 얻으려고합니까? dirname, basename ?
Anycorn

@aaa : 당신이 바로, 나는 내 나오지도 apporach이 실패하는 이유입니다 :) "실제 디렉토리"하지 오라클 실행 파일에 대한 심볼릭 링크 ...를 가리키는 때문에 dirname이 더 나은 생각된다
마이클 마오

답변:


128

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

함께 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)")"

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


멋있는. 여기서 무슨 일이 일어나는지 설명해 주시겠습니까? 그것은 변수 역 참조처럼 보입니다. 명령 결과가 이동하는 기본 임시 변수가 있습니까?
Nate W.

아, 나는 :( 역 따옴표에 대한 compelete 잊어
마이클 마오

4
다른 따옴표 쌍이 필요합니다 cd "$(dirname "$(which oracle)")"..
Philipp

(가) |그렇게하더라도, 새로운 프로세스를 열고 cdSTDIN에서 읽을 수 cmd | cd없는 작업 (즉, 원래 프로세스의 현재 디렉토리가 동일하게 유지 할) 것입니다.
Kyle Strand

23

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

cd $(which oracle | xargs dirname)

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


2
cd "$(which oracle | xargs -0 dirname)"경로에 공백이 포함될 수있는 경우 사용 합니다. -0 플래그는 공백이 아닌 널로 입력을 분할합니다.
anishpatel

9
cd `which oracle`

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


1
경로에 공백이나 기타 "특수"문자가 포함되어 있으면 작동하지 않으며 파일 이름을 제거해야합니다.
Philipp

경로에 특수 문자가 포함되어 있으면 @Philipp이 사용할 수 있습니다cd "`which oracle`"
램 파트라

4

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

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

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


2

파이프가 필요하지 않습니다. 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

1

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

cd $(dirname `which oracle`)

경로에 공백이나 기타 "특수"문자가 포함 된 경우 작동하지 않습니다.
Philipp

1
큰 따옴표를 사용하여 쉽게 수정할 수 있습니다.
David Z

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.