Saya menemukan sh -c
perintah. Saya menemukannya sebelum saya memposting di sini tetapi saya tidak dapat menemukan posting dari Google yang menjelaskannya, jadi saya ingin tahu apa itu dan apa sintaks lengkapnya.
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
sh -c
? Akan lebih baik jika menunjukkan penugasan parameter posisi yang disebutkan di-c
bagianman sh
.The
-c
argumen adalah:Rincian
sh
arugment lain dapat ditemukan dengan menjalankan:Contoh menggunakan string sebagai argumen adalah:
Ini adalah contoh yang lebih rinci
sh -c
. Ini akan mengunduh dokumen dari Google Drive dan membukanya untuk diedit di desktop:sumber
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: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:Untuk mensimulasikan sesi login dan interaktif:
sumber