Lệnh sh -c là gì?


30

Tôi phát hiện ra sh -cmệnh lệnh. Tôi đã tìm thấy nó trước khi tôi đăng ở đây nhưng tôi không thể tìm thấy bất kỳ bài đăng nào từ Google giải thích nó, vì vậy tôi muốn biết nó là gì và cú pháp hoàn chỉnh của nó là gì.

Câu trả lời:


34

shgọi chương trình shlà trình thông dịch và -ccờ 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, shthườ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 -cshell dash sẽ được sử dụng để thực thi lệnh thay vì bash. Shell được gọi với shphụ 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 -ckhi 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 ( -ccờ) 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 -choặc sh -c)

sudo sh -c 'echo "foo" > /home/bar'

sẽ ghi tập tin barchứa văn bản foovào /home/, trong khi sudo echo "foo" > /home/barthấ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

Bạn có thể cung cấp một ví dụ về cách sử dụng 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 -cphần man sh.
edwinksl

15

Đối -csố 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 shvự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 -cví 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"

11

sh -csinh ra một phiên không đăng nhập , không tương tác của sh( dashtrong 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/etc/bash.bashrcvv 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 -itù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~/.bash_loginkhông tồn tại) và /etc/profilesẽ 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 -ltùy chọn:

sh -lc ...

Để mô phỏng cả phiên đăng nhập và tương tác:

sh -lic ...

+1 "sh -c sinh ra một phiên không đăng nhập, không tương tác của sh"
JSON C11
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.