xargs -I#이 예상치 못한 동작을 보여줍니다. 이유는 무엇입니까?

xargs -I#이 예상치 못한 동작을 보여줍니다. 이유는 무엇입니까?

특정 디렉토리에 여러 폴더를 압축하여 각 폴더에 대한 zip 파일을 만들고 싶습니다. 이를 위해 다음 명령을 사용합니다.

$ find -maxdepth 1 -mindepth 1 -type d | xargs -I@ zip -r @.zip @

이것은 예상대로 작동합니다.

#그러나 우연히 다음 대신 대체 문자열로 사용했을 때 예상하지 못한 동작을 발견했습니다 @.

$ find -maxdepth 1 -mindepth 1 -type d | xargs -I# zip -r #.zip #

zip error: Invalid command arguments (cannot write zip file to terminal)

zip error: Invalid command arguments (cannot write zip file to terminal)

... and so on (the same message repeated for every folder)

#댓글은 일반적으로 켜져 있으므로 여기에 문제가 있는 것이 분명합니다. 그러나 명령줄이 실제로는 될 것이라고 생각했을 것입니다 find -maxdepth 1 -mindepth 1 -type d | xargs -I. 왜냐하면 첫 번째 줄부터 포함하여 모든 것이 #주석이고 제거되었기 때문입니다.

그러나 분명히 zip명령을 이행했다. 왜?

답변1

주석( bash셸 내)은 역할에 의해 소개됩니다 #. 그러나 이는 #문자가 인용되지 않고 단어의 첫 번째 문자(토큰)인 경우에만 발생합니다.

#단어의 첫 번째 문자가 아닌 다른 문자로 인용되거나 발생하는 경우 주석이 도입되지 않습니다.

비교하다:

$ echo this is a #comment
this is a
$ echo this is not a#comment
this is not a#comment
$ echo not a '#comment'
not a #comment

대화형 셸에서 주석은 다음과 같습니다.안 돼요interactive_comments쉘 옵션이 꺼진 경우(기본적으로 켜짐) 도입됩니다.

$ shopt -u interactive_comments
$ echo not a #comment
not a #comment

관련 정보