grub2 구성에서 "exec tail -n +3 $0" 명령 뒤에 숨어 있는 논리는 무엇입니까?

grub2 구성에서 "exec tail -n +3 $0" 명령 뒤에 숨어 있는 논리는 무엇입니까?

사용자 정의 메뉴 항목을 만들려면 다음 명령에서 멈춥니다.

exec tail -n +3 $0

터미널에서 시도해 보았지만 이상한 결과가 나왔고 이 명령이 정확히 무엇을 하는지, 왜 grub에 필요한지 이해할 수 없습니다. 설명해 주시겠어요?

답변1

당신이 말하는 경우 /etc/grub.d/40_custom:

$ cat /etc/grub.d/40_custom
#!/bin/sh
exec tail -n +3 $0
# This file provides an easy way to add custom menu entries.  Simply type the
# menu entries you want to add after this comment.  Be careful not to change
# the 'exec tail' line above.

그런 다음 참고하세요.

  • grub-mkconfigGRUB 구성을 구축하기 위한 쉘 스크립트입니다.
  • 이 파일은 "사용자 정의 메뉴 항목을 추가하는 쉬운 방법"으로 간주됩니다. 원하는 GRUB 구성을 정확하게 입력하기만 하면 됩니다.

하지만 이것은 쉘 스크립트이므로 일반적으로 다음과 같은 작업을 수행해야 합니다 echo "menuentry ....". 이를 방지하기 위해 exec tail마법이 사용됩니다. 그게 무슨 역할을 하나요? $0는 실행되는 스크립트의 이름이므로 일반적으로 40_custom실행 /etc/grub.d/40_custom위치와 방법에 따라 다릅니다. 따라서 스크립트는 본질적으로 tail자체적으로 실행되지만 을 사용하면 세 번째 줄에서 시작하도록 -n +3지시합니다 .tail

세 번째 줄부터 모두 인쇄하면 무엇을 얻을 수 있나요 /etc/grub.d/40_custom?

# This file provides an easy way to add custom menu entries.  Simply type the
# menu entries you want to add after this comment.  Be careful not to change
# the 'exec tail' line above.

(또한 이 아래에 배치하는 다른 콘텐츠도 있습니다.)

exec부분은 스크립트를 실행하는 셸을 대체하므로 tail스크립트 외부의 어떤 것도 실제로 실행되지 않습니다.


터미널에서 실행하세요:

  • $0그럴 수도 있고 bash그럴 수도 있지 (아마도 /bin/bash)
  • 이후 exec실행 중인 쉘을 다음으로 대체합니다.tail -n+3 bash
  • bash그리고 지정된 파일이 현재 디렉터리에 없을 수 있으므로 tail지금 종료하십시오.

따라서 최종 결과는 터미널 세션이 거기서 끝날 가능성이 가장 높습니다.

답변2

tail -n +33행에서 시작하여 입력을 인쇄합니다(매뉴얼 페이지). $0은 쉘 스크립트에 있는 스크립트의 이름입니다(Bash 특수 매개변수) 그리고 exec(Bash 내장 기능) 스크립트를 명령으로 바꿉니다. /etc/grub.d/40_custom내 시스템 과 같이 다음과 같은 것이 있을 수 있습니다 .

#!/bin/sh
exec tail -n +3 $0
foo
bar

스크립트를 실행하면 tail스크립트 자체를 읽어서 스크립트를 대체하므로 나머지 스크립트가 출력에 복사됩니다.

grubscript.sh >> grub-config-file내 생각에 grub에는 실행되거나 영향을 미칠 수 있는 구성을 생성하는 많은 스크립트가 있다고 생각합니다 . 스크립트는 출력을 생성하는 데 필요한 모든 논리를 사용할 수 있지만 이 exec tail트릭을 사용하면 스크립트에 의해 시작된 논리를 변경하지 않고 출력에서 ​​몇 개의 고정 행만 덤프할 수 있습니다.

이 마법의 주문 외에도 데비안에는 /etc/grub.d/40_custom사용자에게 알려주는 메모도 포함되어 있습니다.

이 설명 뒤에 추가하려는 메뉴 항목을 입력하기만 하면 됩니다.

관련 정보