Câu trả lời:
sh
gọi chương trình sh
là trình thông dịch và -c
cờ có nghĩa là thực thi lệnh sau như được diễn giải bởi chương trình này.
Trong Ubuntu, sh
thường được liên kết với nhau /bin/dash
, nghĩa là nếu bạn thực thi một lệnh với sh -c
shell dash sẽ được sử dụng để thực thi lệnh thay vì bash. Shell được gọi với sh
phụ thuộc vào liên kết tượng trưng - bạn có thể tìm hiểu vớireadlink -e $(which sh)
. Bạn nên sử dụng sh -c
khi bạn muốn thực thi một lệnh cụ thể với shell đó thay vì bash.
Bạn cũng có thể sử dụng cú pháp này ( -c
cờ) với các thông dịch viên khác. Một cách sử dụng cổ điển của nó (được chỉ ra bởi @edwinksl là giải quyết vấn đề chuyển hướng không hoạt động với sudo (ở đây bạn có thể sử dụng bash -c
hoặc sh -c
)
sudo sh -c 'echo "foo" > /home/bar'
sẽ ghi tập tin bar
chứa văn bản foo
vào /home/
, trong khi sudo echo "foo" > /home/bar
thất bại như được giải thích rất tốt ở đây
Điều quan trọng là sử dụng 'dấu ngoặc đơn' xung quanh chuỗi lệnh, nếu không, trình bao hiện tại sẽ cố gắng mở rộng nó trước khi nó được chuyển đến trình thông dịch mà bạn đã gọi
ví dụ (với python cho đến khi tôi nghĩ ra một lệnh sẽ cho kết quả khác nhau trong dấu gạch ngang ...)
$ python3 -c print (35/7)
bash: syntax error near unexpected token `('
$ python3 -c 'print (35/7)'
5.0
Đối -c
số là:
Đọc các lệnh từ toán hạng Command_ chuỗi thay vì từ đầu vào tiêu chuẩn. Tham số đặc biệt 0 sẽ được đặt từ toán hạng Command_name và các tham số vị trí ($ 1, $ 2, v.v.) được đặt từ các toán hạng đối số còn lại.
Các chi tiết khác của các khu sh
vực có thể được tìm thấy bằng cách chạy:
$ man sh
Một ví dụ về việc sử dụng một chuỗi làm đối số là:
$ sh -c "echo This is a test string"
Đây là một sh -c
ví dụ chi tiết hơn . Nó sẽ tải xuống một tài liệu từ Google Drive và mở nó ra để chỉnh sửa trên máy tính để bàn:
$ sh -c "wget 'https://docs.google.com/document/u/0/d/1jcBtdlMx0f4BhCmAmnIViIy4WN4oRevWFRzse-P00j0/export?format=docx' -O test.docx && xdg-open test.docx 2>/dev/null"
sh -c
sinh ra một phiên không đăng nhập , không tương tác của sh
( dash
trong Ubuntu).
Sau đây lệnh đó sẽ được chạy trong buổi vỏ, nó sẽ được coi như là đối số (tham số vị trí) 0 ( ARGV0
), và phần còn lại như là đối số cho lệnh đó ( ARGV0
), bắt đầu từ 1 ( ARGV1
, ARGV2
, ...).
Bạn cũng có thể sử dụng các tính năng shell điển hình được phép chạy trong loại phiên này, ví dụ như tách lệnh bằng cách ;
sử dụng nhiều lệnh, nhóm lệnh bằng cách sử dụng {}
, sinh ra một lớp con khác ()
, v.v. Việc sử dụng chúng có thể thay đổi một chút các định nghĩa / ví dụ đối số được đề cập trước đó.
Chỉ cần lưu ý, các tính năng chỉ dành riêng cho hệ vỏ tương tác (theo mặc định), ví dụ: mở rộng lịch sử, source
-ing ~/.bashrc
và /etc/bash.bashrc
vv sẽ không có sẵn trong phiên này vì nó không tương tác . Bạn có thể mô phỏng hành vi phiên tương tác (gần như), bằng cách sử dụng -i
tùy chọn:
sh -ic ...
Tương tự, các tính năng chỉ dành riêng cho shell đăng nhập (theo mặc định), ví dụ: source
-ing của ~/.profile
(đã cho ~/.bash_profile
và ~/.bash_login
không tồn tại) và /etc/profile
sẽ không được thực hiện vì shell là shell không đăng nhập . Bạn có thể mô phỏng hành vi shell đăng nhập bằng -l
tùy chọn:
sh -lc ...
Để mô phỏng cả phiên đăng nhập và tương tác:
sh -lic ...
sh -c
? Sẽ rất tuyệt nếu nó thể hiện sự gán các tham số vị trí được đề cập trong-c
phầnman sh
.