“ bash -D ” 명령이 ' 유용한 작업을 수행하지 않는 것 같습니다.

나는 몇 년이 지난 후 마침내 쉘에 더 익숙해 질 수있게되었습니다. bash-D 옵션을 살펴 봅니다. 설명서에 따르면

  -D A list of all double-quoted strings preceded by $ is printed on the standard output. These are the strings that are sub- ject to language translation when the current locale is not C or POSIX. This implies the -n option; no commands will be executed.  

그러나 내 Mac에서는 출력이 생성되지 않고 원래 셸보다 기능이 떨어지는 것처럼 보이는 새 셸에 나를 덤프합니다. which 명령이이 새 셸에서 작동을 멈췄습니다.

누군가가 Mac에서이 옵션이 무엇인지에 대한 통찰력을 제공 할 수 있는지 궁금합니다. 아마도 잘못 사용하고있을 것입니다.

p>

답변

Mac에서는 bash -D는 출력을 생성하지 않습니다.

bash -D (및 이에 상응하는 긴 옵션 --dump-strings)은 표준 입력 또는 파일에서 명령을 읽고 문자열을 추출합니다. 번역 가능으로 표시 , 즉 $"Hello, world"와 같이 앞에 달러 기호가 붙은 큰 따옴표로 묶인 문자열입니다.

bash -D가 입력없이 실행되면 아무것도 출력하지 않고 새 셸을 시작합니다. ( 특수 셸, 아래 참조)

예를 들어이 간단한 스크립트의 경우 /tmp/script :

#!/bin/bash echo $"Hello, world" 

bash -D 출력 :

"Hello, world" 

보시다시피 $"<text>"와 일치하는 줄을 검색하고 달러 기호를 제거하는 것과 같습니다.

더 흥미로운 것은 유사한 옵션 --dump-po-strings의 출력입니다. 즉, Bash man 페이지에 설명 된대로 equivalent to -D, but the output is in the GNU gettext po (portable object) file format. :

bash --dump-po-strings /tmp/script #: /tmp/script:2 msgid "Hello, world" msgstr "" 

이 훌륭한 기사 bash 스크립트에 현지화 지원을 추가하는 방법 이 옵션을 사용하는 방법에 대한 자세한 정보를 제공합니다.

bash -D는 나를 새로운 셸로 덤프합니다. 원래 셸보다 기능이 적습니다.

맞습니다. 새 셸은 어떤 명령에도 반응하지 않습니다. 그 이유는 -D 옵션이 -n 를 의미하기 때문입니다. 셸이 명령을 읽지 만 실행하지는 않도록 지시합니다 .

-n 옵션은 설명이 필요합니다. 언뜻보기에는 쓸모없는 옵션이지만 실제로는 매우 유용합니다. bash -n는 명령을 읽을뿐만 아니라 명령의 유효성도 검사하고 구문이 유효하지 않은 경우 불평하므로 bash -n <script name>를 실행하여 스크립트를 확인할 수 있습니다. 명령을 실행하지 않고 구문 오류를 확인합니다.

즉, bash -D를 실행 한 후 얻은 셸이 명령을 기꺼이 받아들이고 구문 유효성을 확인합니다. 필요한 경우 오류), 아무것도하지 않습니다. 이것이 which “작동하지 않는”이유입니다.

Bash 호출 및 이 동작에 대한 배경 정보는 Bash 참조 설명서의 기본 설정 섹션을 참조하십시오.

댓글

  • 매우 유익합니다. 감사합니다.
  • 이 첫 번째 줄이있는 .sh 파일을 이해하는 동안 여기까지 왔습니다. #!/bin/bash -D -D 옵션은이 컨텍스트에서 무시되는 것으로 인 것 같습니다 . 이 사용이 실제로 보장되는지 여부에 대해 누구든지 의견을 줄 수 있습니까?
  • @iwolf 흥미 롭습니다. " 사용 중지 " 실행 가능한 비트를 변경하지 않고 스크립트 (즉, 스크립트는 여전히 755 / rwxr-xr-x 모드를 가지지 만 아무 작업도 수행하지 않음). 그렇지 않으면 ' 이것이 어떻게 유용 할 수 있는지 전혀 알 수 없습니다. 내 테스트에서 이러한 스크립트는 아무 작업도 수행하지 않습니다 (현지화 가능한 문자열, 즉 달러 기호가 앞에 오는 큰 따옴표로 묶인 문자열 인쇄 제외).

Answer

스크립트를 실행하지 않고 지역화 가능한 모든 문자열을 추출하기위한 것이지만, 제한된 목적으로도 유용하지 않으며 오랫동안 사용되지 않는다고 생각합니다. 무언가를하는 것을보고 싶다면 :

% printf "foo\n\$\"bar\"\n" | bash -D "bar" 

댓글

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다