Basit komutlarla kabuk komut dosyasında exec komutunun kullanımlarını açıklayan var mı?
Basit komutlarla kabuk komut dosyasında exec komutunun kullanımlarını açıklayan var mı?
Yanıtlar:
exec
Çekirdekte yerleşik komut aynalar fonksiyonları dayalı onlardan bir aile vardır execve
genellikle C'den denir
exec
fork
yeni bir işlem yapmadan, geçerli işlemde geçerli programı değiştirir . Yazdığınız her senaryoda kullanacağınız bir şey değildir, ancak bazen kullanışlı olur. İşte kullandığım bazı senaryolar;
Kullanıcının kabuğa erişmeden belirli bir uygulama programını çalıştırmasını istiyoruz. / Etc / passwd içindeki oturum açma programını değiştirebiliriz, ancak belki ortam ayarının başlangıç dosyalarından kullanılmasını istiyoruz. Yani, (örneğin) .profile
, son ifade şöyle bir şey söylüyor:
exec appln-program
şimdi geri dönecek bir kabuk yok. Çöküyor olsa bile appln-program
, son kullanıcı bir kabuğa ulaşamaz, çünkü orada değil - exec
onu değiştirdi.
/ Etc / passwd dosyasındakinden farklı bir kabuk kullanmak istiyoruz. Göründüğü kadar aptalca, bazı siteler kullanıcıların oturum açma kabuklarını değiştirmelerine izin vermez. Tanıdığım bir site herkesin başlamasını csh
ve herkesin .login
(csh başlangıç dosyasını) aramasını istedi ksh
. Bu işe yaraırken, başıboş bir csh
süreç bıraktı ve çıkış, kafa karıştırıcı olabilecek iki aşamaydı. Bu yüzden exec ksh
c-shell programını korn kabuğu ile değiştirdik ve her şeyi daha basit hale getirdik (bunun ksh
bir giriş kabuğu olmadığı gerçeği gibi bununla ilgili başka sorunlar var ).
Sadece süreçleri kurtarmak için. Biz ararsanız prog1 -> prog2 -> prog3 -> prog4
vb ve asla geri, ardından her çağrı düzey yöneticisin olun. Kaynakları korur (tekrarlanana kadar, çok fazla değil, kuşkusuz) ve kapatmayı kolaylaştırır.
Belli bir exec
yerde kullanıldığını gördünüz , belki de hata yapan kodu gösterdiyseniz, kullanımını haklı çıkarabiliriz.
Düzenleme : Yukarıdaki cevabımın eksik olduğunu fark ettim. Kabuklarda ve - dosya tanımlayıcılarını açmak için kullanılan iki kullanım vardır . İşte bazı örnekler:exec
ksh
bash
exec 3< thisfile # open "thisfile" for reading on file descriptor 3
exec 4> thatfile # open "thatfile" for writing on file descriptor 4
exec 8<> tother # open "tother" for reading and writing on fd 8
exec 6>> other # open "other" for appending on file descriptor 6
exec 5<&0 # copy read file descriptor 0 onto file descriptor 5
exec 7>&4 # copy write file descriptor 4 onto 7
exec 3<&- # close the read file descriptor 3
exec 6>&- # close the write file descriptor 6
Burada boşluk bırakmanın çok önemli olduğunu unutmayın. Eğer fd numarası ve yönlendirme sembolü arasına bir boşluk exec
yerleştirirseniz orijinal anlamı geri döner:
exec 3 < thisfile # oops, overwrite the current program with command "3"
Birkaç Ksh kullanımına bu kullanabilirsiniz yolu vardır read -u
veya print -u
üzerinde, bash
örneğin,:
read <&3
echo stuff >&4
exec gunicorn
süpervizöre doğru pid'i veren bir kabuk betiğinden silahı çalıştırmak çok daha kolay ve daha sürdürülebilir .
exec
yönlendirme için kullanılabilir:> komut belirtilmemişse, herhangi yönlendirmeler geçerli kabuğunda etkili olması ve dönüş durumu 0 olan bir yönlendirme hatası varsa, dönüş durumu 1'dir Ama nasıl yapar exec
aslında bir dosya tanımlayıcı değiştirmek için çalışır? Bu özel komut neden bu görev için seçildi? (Markdown şu anda başarısız mı?)
exec >.\logfilename.log 2>&1
&>
bir bash
uzantıdır (bkz. man bash
) Ve örneğiniz buna eşdeğerdir exec >/var/log/userdata.log 2>&1
. Başka bir deyişle, stdout ve stderr dosyalarını bu dosyaya yönlendirir. Aşağıdaki komutlar sıfırlanmadıkça bu yönlendirmeleri devralır, ancak yürütülürler.
Kabul edilen cevabı kısa bir acemi dostu kısa cevapla arttırmak için muhtemelen ihtiyacınız yoktur exec
.
Hâlâ buradaysanız, aşağıdaki tartışma umarım nedenini açıklamalıdır. Koştuğunda söyle,
sh -c 'command'
bir sh
örnek çalıştırırsınız , ardından command
o sh
örneğin alt öğesi olarak başlarsınız . Bittiğinde command
, sh
örnek de biter.
sh -c 'exec command'
bir sh
örneği çalıştırır , ardından bu örneği ikili ile değiştirir ve onun yerine çalıştırır.sh
command
Elbette, her ikisi de bu sınırlı bağlamda işe yaramaz; sadece istiyorsun
command
Kabuğun yapılandırma dosyasını okumasını veya ortamı bir şekilde çalışmaya hazırlanmak için ayarlamasını istediğiniz bazı durumlar vardır command
. exec command
Yararlı olan tek durum budur.
#!/bin/sh
ENVIRONMENT=$(some complex task)
exec command
Bu, gerekli olanı içerecek şekilde ortamı hazırlamak için bazı şeyler yapar. Bu yapıldıktan sonra, sh
örnek artık gerekli değildir ve bu nedenle , alt işlem olarak çalıştırmak ve beklemek, sonra biter bitmez çıkmak yerine sh
örneği basitçe command
işlemle değiştirmek (küçük) bir optimizasyondur sh
.
Benzer şekilde, bir kabuk komut dosyasının sonundaki ağır komut için mümkün olduğunca fazla kaynak boşaltmak isterseniz, exec
bu komutu bir optimizasyon olarak kullanmak isteyebilirsiniz .
Şey güçlerinin Eğer çalıştırmak için sh
ama sen gerçekten başka bir şey çalıştırmak istedim, exec something else
istenmeyen yerine ders geçici bir çözüm taşımaktadır sh
örneğin gerçekten kendi şık yapmak isterse gibi (örneğini gosh
yerine sh
ama seninki yer almıyorsa /etc/shells
yapabilirsiniz böylece giriş kabuğunuz olarak belirtmeyin).
exec
Dosya tanımlayıcılarını işlemek için ikinci kullanımı ayrı bir konudur. Kabul edilen cevap güzel bir şekilde bunu kapsar; bu müstakil tutmak için exec
, bir komut adı yerine bir yönlendirme izleyen herhangi bir şey için el kitabına erteleyeceğim .
bush
. Tabii ki, bu bash
herhangi bir popüler Unix kabuğu için de veya genel olarak geçerlidir ; @anishsane notlarına göre , Bash bash -c 'command'
bunu yaparak gizlice optimize eder exec command
.