사용자 정의 메뉴 항목을 만들려면 다음 명령에서 멈춥니다.
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-mkconfig
GRUB 구성을 구축하기 위한 쉘 스크립트입니다.- 이 파일은 "사용자 정의 메뉴 항목을 추가하는 쉬운 방법"으로 간주됩니다. 원하는 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 +3
3행에서 시작하여 입력을 인쇄합니다(매뉴얼 페이지). $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
사용자에게 알려주는 메모도 포함되어 있습니다.
이 설명 뒤에 추가하려는 메뉴 항목을 입력하기만 하면 됩니다.