Logic nào mà lệnh exec exec tail -n +3 $ 0 từ cấu hình grub2 có?


8

Tạo mục menu tùy chỉnh, bị kẹt trên lệnh này:

exec tail -n +3 $0

Đã thử nó trong thiết bị đầu cuối, có kết quả kỳ lạ, không thể hiểu, chính xác lệnh này làm gì và tại sao grub cần nó. Bạn có thể giải thích?

Câu trả lời:


10

tail -n +3in đầu vào của nó, bắt đầu từ dòng 3 ( trang man ). $0là 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_customhệ 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-filehoặ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 tailthủ 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_customcò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.


FWIW, nheo mắt khó khăn và giả sử #là một nhân vật bình luận cho grub anway, #!/bin/catcũng nên làm việc. (Tuy nhiên, bạn sẽ có dòng bình luận shebang ở đầu ra.)
Ulrich Schwarz

11

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:

  • đây là tập lệnh shell và được thực thi bằng cách grub-mkconfigxây dựng cấu hình GRUB
  • tệp này được coi là "một cách dễ dàng để thêm các mục menu tùy chỉnh" - bạn chỉ cần nhập chính xác bất kỳ cấu hình GRUB nào bạn muốn.

Như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 tailphé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ó tailsẽ 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 execthay 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:

  • $0có lẽ bashhoặc một cái gì đó tương tự (nó có thể /bin/bash)
  • và bởi vì exec, bạn đang thay thế vỏ đang chạy bằngtail -n+3 bash
  • và vì bạn có thể không có một tệp có tên bashtrong thư mục hiện tại của bạn, hãy tailthoá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 ở đó.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.