Câu trả lời:
tail -n +3
in đầu vào của nó, bắt đầu từ dòng 3 ( trang man ). $0
là tên của tập lệnh trong tập lệnh shell ( tham số đặc biệt Bash ) và exec
(tập tin Bash ) thay thế tập lệnh bằng lệnh. Bạn có thể có một cái gì đó như thế này (như trong /etc/grub.d/40_custom
hệ thống của tôi):
#!/bin/sh
exec tail -n +3 $0
foo
bar
Khi bạn chạy tập lệnh, nó sẽ tự thay thế bằng cách tail
đọc chính tập lệnh, vì vậy phần còn lại của tập lệnh sẽ được sao chép vào đầu ra của tập lệnh.
Tôi nghĩ rằng grub có một loạt các kịch bản để tạo cấu hình của nó, chúng có thể được thực thi như grubscript.sh >> grub-config-file
hoặc một cái gì đó để có hiệu lực. Các tập lệnh có thể sử dụng bất kỳ logic nào chúng cần để tạo đầu ra, nhưng exec tail
thủ thuật cho phép chỉ bỏ một số dòng cố định trong đầu ra mà không thay đổi logic mà tập lệnh được bắt đầu.
Ngoài câu thần chú đó, Debian /etc/grub.d/40_custom
còn bao gồm một lời bình luận cho người dùng biết
Chỉ cần nhập các mục menu bạn muốn thêm sau bình luận này.
Nếu bạn đang nói về /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.
Sau đó lưu ý rằng:
grub-mkconfig
xây dựng cấu hình GRUBNhưng đây là một kịch bản shell, vì vậy thường bạn sẽ phải làm một cái gì đó như echo "menuentry ...."
v.v. Để tránh điều đó, exec tail
phép thuật được sử dụng. Cái đó làm cái gì? $0
, hãy nhớ, là tên của tập lệnh được thực thi, vì vậy thông thường nó sẽ là 40_custom
(hoặc /etc/grub.d/40_custom
, v.v. tùy thuộc vào vị trí và cách nó được chạy). Vì vậy, kịch bản về cơ bản là tự chạy tail
, nhưng với -n +3
, nó tail
sẽ bắt đầu từ dòng thứ ba.
Bạn nhận được gì nếu bạn xuất mọi thứ từ dòng thứ ba trở đi /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.
(Và ngoài ra, bất cứ điều gì khác bạn đặt dưới đây.)
Phần exec
thay thế shell đang thực thi tập lệnh tail
, do đó, không có gì khác từ tập lệnh được thực thi.
Chạy nó trong thiết bị đầu cuối:
$0
có lẽ bash
hoặc một cái gì đó tương tự (nó có thể /bin/bash
)exec
, bạn đang thay thế vỏ đang chạy bằngtail -n+3 bash
bash
trong thư mục hiện tại của bạn, hãy tail
thoát ngay lập tức.Vì vậy, kết quả cuối cùng có khả năng là phiên cuối của bạn kết thúc ở đó.
#
là một nhân vật bình luận cho grub anway,#!/bin/cat
cũng nên làm việc. (Tuy nhiên, bạn sẽ có dòng bình luận shebang ở đầu ra.)