“xargs”와 명령 대체의 차이점은 무엇입니까?


14

많은 경우에 나는 대신 명령 대체를 사용 xargs합니다. 예 rm $(ls)와 동일ls | xargs rm

그들 사이의 차이점은 무엇입니까?

차이점 중 하나는 xargs현재 쉘에서 실행되는 동안 명령 대체가 서브 쉘에서 실행되지만 확실하지 않다는 것입니다.

차이점을 기재하십시오.

답변:


9

한 가지 차이점은 파이프 대신 명령 대체를 사용할 때 전달되는 데이터의 크기가 명령 버퍼의 크기에 의해 제한되므로 어떤 경우에는 경고없이 잘립니다. 또한 다음 명령으로 전달되기 전에 전체 명령 출력을 생성하고 메모리에 저장해야하므로 큰 출력의 경우 필요한 것보다 훨씬 많은 메모리를 사용할 수 있습니다.

첫 번째 방법의 또 다른 문제는 출력이 공백으로 분할되어 공백이있는 파일 이름을 처리 할 수 ​​없다는 것입니다. xargs또한 공백 문제의 영향을 받지만 사용되는 구분 기호를 변경하여 해결할 수 있습니다. 파일 이름을 올바르게 처리하려면 두 번째 예에서 널 바이트를 구분 기호로 사용해야합니다.

세 번째 문제는 글롭이 확장되어 파일 이름에 별표 나 물음표가 있으면 예기치 않은 결과가 발생한다는 것입니다.

http://mywiki.wooledge.org/ParsingLs :이 문제에 대한 좋은 토론을 찾을 수 있습니다

올바른 구문은

echo rm *

또는 xargs를 사용해야하는 경우

find . -maxdepth 1 -print0 | xargs -0 echo rm

echo출력이 올 바르면 제거 하십시오.


1
@Sinoosh : xargs또한 활성화하지 않으면 파이프로 인해 서브 쉘에서 실행됩니다. shopt -s lastpipe이 경우 현재 쉘에서 실행됩니다. 변수를 변경하지 않기 때문에이 경우 서브 쉘에서 실행하는 것이 문제라고 생각하지 않습니다.
user000001

1
@Sinoosh : 인수를 하나씩 전달하려면 다음 -l과 같이 플래그를 사용할 수 있습니다 find . -maxdepth 1 -print0 | xargs -0 -l rm. 두 번째 질문의 경우, ls는 null bute에서 출력을 분할하지 않고 개행 (파일 이름 BTW에 유효)으로 사용자 ls와 함께 사용할 수 없습니다.xargs -0
user000001

1
@Sinoosh : 첫 번째 단락이 아니라 두 번째 단락 : -0옵션이 없는 xargs 에는 공백 문제가 있습니다.
user000001

1
읽지 말고 테스트에 man xargs사용하십시오 . 쉘 제한을 초과하자 (일부 버퍼는 65K로 제한되고 파일 이름 목록은 그렇지 않음). echormxargs
waltinator

1
@Sinoosh : 편리한 참조 자료는 없지만 입력 할 수 있으며 xargs --show-limits시스템에 설정된 한계를 볼 수 있습니다.
user000001
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.