Apa perintah sh -c?

31

Saya menemukan sh -cperintah. 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.

Lan ...
sumber

Jawaban:

34

shmemanggil program shsebagai juru bahasa dan -cbendera berarti menjalankan perintah berikut sebagaimana ditafsirkan oleh program ini.

Di Ubuntu, shbiasanya symlinked to /bin/dash, artinya jika Anda menjalankan perintah dengan sh -cdash shell akan digunakan untuk mengeksekusi perintah alih-alih bash. Shell yang dipanggil dengan shtergantung pada symlink - Anda dapat mengetahuinya readlink -e $(which sh). Anda harus menggunakan sh -cketika Anda ingin menjalankan perintah khusus dengan shell itu daripada bash.

Anda dapat menggunakan sintaks ini ( -cbendera) 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 -catau sh -c)

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

akan menulis file barberisi teks foountuk /home/sementara sudo echo "foo" > /home/bargagal 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
Zanna
sumber
Bisakah Anda memberikan contoh cara menggunakannya sh -c? Akan lebih baik jika menunjukkan penugasan parameter posisi yang disebutkan di -cbagian man sh.
edwinksl
15

The -cargumen 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 sharugment 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"
LD James
sumber
11

sh -cmemunculkan sesi non-login , non-interaktifsh ( dashdi 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 ~/.bashrcdan /etc/bash.bashrclain - lain tidak akan tersedia dalam sesi ini karena tidak interaktif . Anda dapat mensimulasikan perilaku sesi interaktif (hampir), dengan menggunakan -iopsi:

sh -ic ...

Demikian pula, fitur-fitur yang khusus untuk shell login saja (secara default) misalnya source-in ~/.profile(diberikan ~/.bash_profiledan ~/.bash_logintidak ada) dan /etc/profiletidak akan dilakukan karena shell adalah shell non-login . Anda dapat mensimulasikan perilaku shell-login menggunakan -lopsi:

sh -lc ...

Untuk mensimulasikan sesi login dan interaktif:

sh -lic ...
heemayl
sumber
+1 "sh -c memunculkan sesi sh-non-login non-interaktif"
JSON C11