xargs를 사용하여 디렉토리로 cd


28

지금 바보 같은 느낌. 왜 이것이 작동하지 않습니까?

echo "/some/directory/path" | xargs -n1 cd

답변:


22

파이프는 서브 프로세스에서 xargs를 실행하고 xargs는 서브 프로세스에서 cd를 실행합니다. 서브 프로세스의 변경 사항은 상위 프로세스로 전파되지 않습니다.


그것은 완전하게 이해됩니다. 유닉스 멍청한 놈을 도와 주셔서 감사합니다.
Ian Lotinsky

3
따옴표를 사용하여 원하는 효과를 얻을 수 있습니다. cd `echo "/some/directory/path" | cut -d\ -f1` (공간에 분할하고 xargs가하는 방식으로 첫 번째 항목을 잡기 위해 'cut'을 추가했습니다.)
Slartibartfast

5
실제로 는 쉘 내장이 필요하므로 독립형 실행 파일 만 실행할 수 있기 때문에 xargs실행할 수 없습니다 . 그러나 서브 프로세스에 대해 말한 것은 사실입니다. cdxargs
추후 공지가있을 때까지 일시 중지되었습니다.

/ usr / bin / cd는 적어도 솔라리스에서 유닉스 독립형 문서화 된 명령입니다.
jlliagre

자동 생성 경로에 @Slartibartfast 사용 : cd `port file libcudd | sed -e 's/\/Portfile//'` (일반적으로이 MacPorts 포트 파일 위치와 같이 수동으로 처리하지 않으려는 긴 경로 )
Ioannis Filippidis

23

cd현재 디렉토리에 대한 정보가 프로세스에 연결되어 있고 쉘 내장 만이 실행중인 쉘의 현재 디렉토리를 변경할 수 있기 때문에 명령 은 내장되어 있습니다.

코드에는 두 가지 문제가 있습니다.

  1. xargs내장 명령 cd이므로 실행할 수 없으며 실행 파일 만 실행할 수 있습니다.cdxargs
  2. 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'
wisbucky

더 나은 솔루션은 다음과 같습니다. ls | xargs를 -L 1 -I @@의 bash -c 'CD @@ & & pwd을 && ls'이 (가)
로마 M
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.