답변:
파이프는 서브 프로세스에서 xargs를 실행하고 xargs는 서브 프로세스에서 cd를 실행합니다. 서브 프로세스의 변경 사항은 상위 프로세스로 전파되지 않습니다.
cd `echo "/some/directory/path" | cut -d\ -f1`
(공간에 분할하고 xargs가하는 방식으로 첫 번째 항목을 잡기 위해 'cut'을 추가했습니다.)
xargs
실행할 수 없습니다 . 그러나 서브 프로세스에 대해 말한 것은 사실입니다. cd
xargs
cd `port file libcudd | sed -e 's/\/Portfile//'`
(일반적으로이 MacPorts 포트 파일 위치와 같이 수동으로 처리하지 않으려는 긴 경로 )
cd
현재 디렉토리에 대한 정보가 프로세스에 연결되어 있고 쉘 내장 만이 실행중인 쉘의 현재 디렉토리를 변경할 수 있기 때문에 명령 은 내장되어 있습니다.
코드에는 두 가지 문제가 있습니다.
xargs
내장 명령 cd
이므로 실행할 수 없으며 실행 파일 만 실행할 수 있습니다.cd
xargs
cd
에서 호출 된 하위 프로세스에서 실행하더라도 xargs
위에서 설명한대로 상위 프로세스에는 영향을 미치지 않습니다.해결책은 내부에서 하위 셸을 실행 한 cd
다음 새 현재 디렉토리에서 명령을 실행할 수 있다는 것입니다.
ls | xargs -L 1 bash -c 'cd "$0" && pwd && ls'
ls | xargs ...
이 예에서는 의미가 없습니다 . 다음 $0
과 같은 값을 전달해야합니다.echo "/some/directory/path" | xargs -L 1 bash -c 'cd "$0" && pwd && ls'