Jawaban:
sh
memanggil program sh
sebagai juru bahasa dan -c
bendera berarti menjalankan perintah berikut sebagaimana ditafsirkan oleh program ini.
Di Ubuntu, sh
biasanya symlinked to /bin/dash
, artinya jika Anda menjalankan perintah dengan sh -c
dash shell akan digunakan untuk mengeksekusi perintah alih-alih bash. Shell yang dipanggil dengan sh
tergantung pada symlink - Anda dapat mengetahuinya readlink -e $(which sh)
. Anda harus menggunakan sh -c
ketika Anda ingin menjalankan perintah khusus dengan shell itu daripada bash.
Anda dapat menggunakan sintaks ini ( -c
bendera) dengan penerjemah lain juga. Salah satu penggunaan klasiknya (ditunjukkan oleh @edwinksl adalah untuk mengatasi masalah pengalihan tidak bekerja dengan sudo (di sini Anda dapat menggunakan bash -c
atau sh -c
)
sudo sh -c 'echo "foo" > /home/bar'
akan menulis file bar
berisi teks foo
untuk /home/
sementara sudo echo "foo" > /home/bar
gagal seperti yang dijelaskan sangat baik di sini
Sangat penting untuk menggunakan 'tanda kutip tunggal' di sekitar string perintah, jika tidak, shell saat ini akan mencoba untuk memperluasnya sebelum diteruskan ke penerjemah yang Anda panggil
misalnya (dengan python sampai saya memikirkan sebuah perintah yang akan memberikan hasil yang berbeda di dash ...)
$ python3 -c print (35/7)
bash: syntax error near unexpected token `('
$ python3 -c 'print (35/7)'
5.0
The -c
argumen adalah:
Baca perintah dari operand command_string alih-alih dari input standar. Parameter khusus 0 akan ditetapkan dari operand command_name dan parameter posisi ($ 1, $ 2, dll.) Ditetapkan dari operan argumen yang tersisa.
Rincian sh
arugment lain dapat ditemukan dengan menjalankan:
$ man sh
Contoh menggunakan string sebagai argumen adalah:
$ sh -c "echo This is a test string"
Ini adalah contoh yang lebih rinci sh -c
. Ini akan mengunduh dokumen dari Google Drive dan membukanya untuk diedit di desktop:
$ 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
memunculkan sesi non-login , non-interaktifsh
( dash
di Ubuntu).
Perintah berikut yang akan dijalankan dalam sesi shell, ia akan diperlakukan sebagai argumen (parameter posisional) 0 ( ARGV0
), dan sisanya sebagai argumen untuk perintah yang ( ARGV0
), mulai dari 1 ( ARGV1
, ARGV2
, ...).
Anda juga dapat menggunakan fitur-fitur khas shell yang diizinkan untuk dijalankan dalam sesi semacam ini misalnya pemisahan perintah menggunakan ;
untuk menggunakan beberapa perintah, menggunakan pengelompokan perintah {}
, menelurkan subkulit lain dengan ()
, dan sebagainya. Penggunaan ini sedikit dapat mengubah definisi argumen / contoh yang disebutkan sebelumnya.
Sebagai catatan, fitur-fitur yang khusus untuk shell interaktif saja (secara default), mis. Ekspansi sejarah, source
-dari ~/.bashrc
dan /etc/bash.bashrc
lain - lain tidak akan tersedia dalam sesi ini karena tidak interaktif . Anda dapat mensimulasikan perilaku sesi interaktif (hampir), dengan menggunakan -i
opsi:
sh -ic ...
Demikian pula, fitur-fitur yang khusus untuk shell login saja (secara default) misalnya source
-in ~/.profile
(diberikan ~/.bash_profile
dan ~/.bash_login
tidak ada) dan /etc/profile
tidak akan dilakukan karena shell adalah shell non-login . Anda dapat mensimulasikan perilaku shell-login menggunakan -l
opsi:
sh -lc ...
Untuk mensimulasikan sesi login dan interaktif:
sh -lic ...
sh -c
? Akan lebih baik jika menunjukkan penugasan parameter posisi yang disebutkan di-c
bagianman sh
.