'xargs'는 stdio를 통해 'cd'에 인수를 보내지 않습니다.

'xargs'는 stdio를 통해 'cd'에 인수를 보내지 않습니다.

내 경험상 "xargs"에서 나타나는 동작은 매우 예상치 못한 것 같습니다. "ls"를 사용하여 일치하는 폴더 이름을 찾고 "xargs"를 사용하여 "cd"로 보냅니다. 폴더가 존재하지 않는다는 메시지가 뜹니다. 그러나 "xargs"를 사용하지 않으면 "cd"가 작동합니다. 또한 "xargs"를 사용하지만 "cd" 대신 "ls"로 보내면 작동합니다.

# Identify desired directory
ls -d *[Aa]nt*

   201909+ants/

# Print the desired command with "echo"
ls -d *[Aa]nt* | xargs echo cd

   cd 201909+ants/

# Execute the desired command and get error
ls -d *[Aa]nt* | xargs cd

   xargs: cd: No such file or directory

# Confirm that the desired command without "xargs"
cd 201909+ants  # This works no problem
cd ..           # Go back up
cd 201909+ants/ # This works no problem
cd ..           # Go back up

# Confirm that "xargs" with "ls"
ls -d *[Aa]nt* | xargs ls -d

   201909+ants/

나는 이것이 키보드와 의자 사이의 ID1OT 문제라고 확신합니다. 누구든지 내 실수가 어디에 있는지 지적할 수 있나요?

Cygwin에서 Bash를 사용하고 있지만 Linux에서는 거의 차이점이 없습니다. 이런 차이를 마지막으로 본 게 언제인지 기억이 나지 않습니다.

답변1

작업 디렉터리는 실행 중인 프로세스의 속성이며 프로세스 자체 내에서 변경되어야 합니다. 따라서 cd이는 쉘에 내장된 명령입니다. 그러나 xargs(보통) 그렇지 않으며 쉘 내장 기능을 실행할 수 없습니다. 그것이 하는 일은 외부 프로그램을 호출하는 것뿐입니다.

실제로 외부 프로그램으로 작동하지 않기 때문에 cd일반적으로 Linux 시스템에서는 사용할 수 없습니다. 이것이 바로 오류가 발생하는 이유입니다.

일부 사양에 따라야 하기 때문에 다른 시스템에서도 마찬가지일 수 있습니다. 바라보다CD는 왜 프로그램이 아닌가?. 그러나 그다지 유용하지는 않습니다. 프로세스의 작업 디렉터리만 변경 cd하고 즉시 종료됩니다.

ls하지만 여기서도 그럴 필요는 없습니다 xargs. 이것 ls *.txt저것 해보면 그렇죠껍데기패턴과 일치하는 파일 이름 목록을 생성하고 목록은 ls, ...에 전달되고 인쇄됩니다. 당신이 했던 것과 거의 똑같습니다 echo *.txt. ( 파일에 대한 다른 모든 데이터를 찾는 데 실제 작업이 수행되는 곳이기 ls -l *.txt때문에 더 의미가 있습니다 .) 따라서 중복되는 대신 명령줄을 사용하여 인쇄할 수 있습니다. , 이를 다른 프로그램의 명령줄에 대한 입력으로 변환합니다.lsls *[Aa]nt* |xargsecho *[Aa]nt* | xargsechoxargs

간단한 경우에는 직접 사용할 수 있어야 합니다.

cd *[Aa]nt*

그러나 패턴이 두 개 이상의 파일 이름과 일치하면 오류가 발생합니다(또는 cd foo barksh에서 현재 작업 디렉터리 경로의 문자열 대체와 같은 일부 셸에서 이상한 동작이 발생합니다).

(물론 ls *.txt파이프로 리다이렉트할 때 파일명은 한 줄에 하나씩 출력되지만, echo *.txt한 줄에 모두 출력하므로 그렇지 않다.정확히같은. )

관련 정보