Sh -c komutu nedir?


30

sh -cKomutu keşfettim . Buraya gönderilmeden önce buldum ancak Google’dan bunu açıklayan herhangi bir yazı bulamıyorum, bu yüzden bunun ne olduğunu ve sözdiziminin tamamının ne olduğunu bilmek istiyorum.

Yanıtlar:


34

shprogramı shtercüman olarak çağırır ve -cbayrak, bu komutu yorumladığı şekilde aşağıdaki komutu yerine getirir.

Ubuntu'da, shgenellikle sembolize edilir /bin/dash, bunun anlamı sh -c, çizgi kabuğu ile bir komut çalıştırdığınızda bash yerine komutu çalıştırmak için kullanılacaktır. shİle çağrılan kabuk sembolik bağlantıya bağlıdır - öğrenebilirsiniz readlink -e $(which sh). sh -cKomutu özellikle bash yerine o kabukla bir komut çalıştırmak istediğinizde kullanmalısınız .

Bu sözdizimini ( -cbayrak) diğer tercümanlarla da kullanabilirsiniz. Bunun klasik bir kullanımı (@edwinksl tarafından işaret edilen , sudo ile çalışmayan yönlendirme sorununu aşmaktır (burada bash -cveya kullanabilirsiniz sh -c)

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

dosyasına yazacaktır barmetin içeren fooiçin /home/ise, sudo echo "foo" > /home/barbaşarısız burada çok iyi açıklandığı gibi

Komut dizgisinde 'tek tırnak' kullanmak önemlidir, aksi takdirde mevcut kabuk, aradığınız tercümana geçmeden önce onu genişletmeye çalışır.

örneğin (tire ile farklı sonuçlar verecek bir komut düşünene kadar python ile ...)

$ python3 -c print (35/7)
bash: syntax error near unexpected token `('
$ python3 -c 'print (35/7)'
5.0

Nasıl kullanılacağına dair bir örnek verebilir sh -cmisiniz? O anlatılan konumsal parametreler atama göstermesi halinde ekstra güzel olurdu -cparçası man sh.
edwinksl

15

-cArgümanı:

Komutları standart girdi yerine command_string işlenenden okuyun. Özel parametre 0, komut_adı işlecinden ve konumsal parametrelerden ($ 1, $ 2, vb.) Kalan argüman işleyicilerinden ayarlanır.

shDüzenlemelerin diğer detaylarını çalıştırarak bulabilirsiniz:

$ man sh

Bir dizgiyi argüman olarak kullanmanın bir örneği:

$ sh -c "echo This is a test string"

Bu daha ayrıntılı bir sh -cörnek. Google Drive’dan bir doküman indirecek ve masaüstünde düzenlemek için açacak:

$ 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 -coturum açma olmayan , etkileşimli olmayan bir oturumun sh( dashUbuntu'da) çoğaltılması .

Bu kabuk oturumda çalıştırılacak komutu aşağıdaki, 0 (bağımsız değişken (pozisyonel parametresi) olarak kabul edilir ARGV0), ve bu komuta bağımsız değişkeni (kalan kısım ARGV01'den başlayarak) ( ARGV1, ARGV2, ...).

Bu tür bir oturumda çalışmasına izin verilen tipik kabuk özelliklerini de kullanabilirsiniz; örneğin ;, birden çok komut kullanarak komut ayırma , komut kullanarak gruplama {}, başka bir alt kabuk oluşturma ()ve benzeri işlemler. Bunların kullanımı, daha önce bahsedilen argüman tanımlarını / örneklerini biraz değiştirebilir.


Sadece not etmek gerekirse, yalnızca etkileşimli kabuklara özgü özellikler (varsayılan olarak), örneğin, tarihin genişletilmesi, source-ing ~/.bashrcve /etc/bash.bashrcvb. Bu oturumda etkileşimli olmadığı için kullanılamaz . -iSeçeneği kullanarak etkileşimli oturumlar davranışını (neredeyse) simüle edebilirsiniz :

sh -ic ...

Benzer şekilde, oturum açma özelliğine özgü özellikler yalnızca (varsayılan olarak), örneğin source-ing ~/.profile(verilen ~/.bash_profileve ~/.bash_loginbulunmayan) /etc/profilekabuklarıdır ve kabuk, oturum açma dışı bir kabuk olduğu için yapılmayacaktır . Bu -lseçeneği kullanarak oturum açma kabukları davranışını simüle edebilirsiniz :

sh -lc ...

Hem giriş hem de etkileşimli oturumları simüle etmek için:

sh -lic ...

+1 "sh -c, oturum açmayan, etkileşimli olmayan sh oturumunu
JSON C11
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.