`printf -- "#!${opt_E}"` 명령 해석

`printf -- "#!${opt_E}"` 명령 해석

이 명령을 이해할 수 없고 혼란스럽습니다. 작동 방식을 이해하기 위해 Linux에서 수행한 작업은 다음과 같습니다.

[root@testgfs2 final_scripts]# printf -- "#!${opt_E}"
printf -- "#reset{opt_E}"
#reset{opt_E}[root@testgfs2 final_scripts]# printf -- "#!${opt_E}"
printf -- "#"#reset{opt_E}"{opt_E}"
##reset{opt_E}{opt_E}[root@testgfs2 final_scripts]# echo !$
echo "#"#reset{opt_E}"{opt_E}"
##reset{opt_E}{opt_E}

이것이 어떻게 작동하는지, 어떤 테마에 나타나는지 모르기 때문에 Google에서도 찾을 수 없습니다.

--printf 후에 무엇을 해야 할까요?

답변1

바라보다배쉬 참조 매뉴얼:

! ! :$

이전 명령의 마지막 매개변수를 지정합니다. 이는 !$로 축약될 수 있습니다.

불쾌한 행동이라면 도망가셔도 됩니다! 백슬래시 사용:

% echo "\!$"                  
!$

답변2

극중 캐릭터는 #!이런 상황에서 특별하지 않다. 이 코드 조각은 두 개의 매개변수를 사용하여 명령을 printf -- "#!${opt_E}"호출합니다 : , 및 변수 값과 연결됩니다 . 이 매개변수는 이후에 로 시작하는 매개변수가 있어도 옵션으로 해석되지 않음 을 나타냅니다 . 로 시작하지 않기 때문입니다 . 큰따옴표는 주석 시작 문자가 해석되는 것을 방지 하고 값이 와일드카드 패턴으로 해석되는 별도의 단어로 분할되는 것을 방지합니다.printf--#!opt_E--printf-#!${opt_E}-#!${opt_E}#opt_E

값에 또는 문자가 opt_E포함되어 있지 않으면 이 명령은 끝에 개행 문자 없이 뒤에 오는 값을 인쇄합니다 . 일반적으로 이 명령은 값을 printf 형식으로 해석합니다.%\#!opt_Eopt_E

대화형 셸에서 이 작업을 시도하면 !이전 명령을 자동으로 호출하는 기록 확장 문자로 해석된다는 점에서 이상한 효과를 볼 수 있습니다. 이를 방지하려면 작은따옴표로 문자 그대로 해석하기 \전에 . 를 추가하세요 !.!printf -- '#!${opt_E}'

스크립트를 재생하려면 opt_E먼저 올바른 값을 설정해야 합니다. 스크립트를 디버깅하려는 경우 set -x두 번째 줄을 추가합니다(첫 번째 줄 바로 아래에 삽입 #!). 쉘은 실행될 때 각 줄에 대한 추적 정보를 인쇄합니다.

관련 정보