ændrük'ün cevabı gayet iyi, fakat görev için belki biraz ağır.
İşte argümanlarına dayanarak bir script yazan bir script.
#!/bin/sh
# terminal-plus-command: start a subordinate terminal which runs
# the interactive shell after first running the command arguments
tmpscript=/tmp/tmpscript.$$
echo "#!$SHELL" > $tmpscript
echo "$@" >> $tmpscript
echo exec "$SHELL" >> $tmpscript
chmod +x $tmpscript
gnome-terminal --command $tmpscript
rm -f $tmpscript
Çok fazla kabuk programlama yapmadıysanız, burada olduğundan daha fazla sihir var gibi gözüküyor. İlk önce, betiği tutmak için $$
bu betiği çalıştıran kabuğun işlem kimliğinin bulunduğu geçici bir dosya adı . /tmp/something.$$
Metafor bu yazısının iki örneği aynı anda çalıştırılır durumda kullanılır, aynı geçici dosyayı kullanmayı deneyin olmaz.
Değişken $SHELL
, betiği çalıştıran kabuğun adına ayarlanmıştır. Eğer / usr / bin / bash kullanıyorsanız, muhtemelen mini betiğin de kullanmasını istersiniz.
"$@"
"Gerekirse onları alıntı, bütün argümanları arasına sokmak" için bir kabuk deyim olduğunu. Bu tuhaf sözdizimi neden olur
script.sh 'my file' your\ file
Argümanları iki unsur olarak enterpolasyon etmek
"my file" "your file"
dört yerine $@
doğuracak
"my" "file" "your" "file"
Betiğin son satırları, bir gnome-terminalinin mini betiği çalıştırmaya başlaması ve ardından etkileşimli bir kabuk başlatması için düzenlenir. GNOME terminali çıktığında, geçici komut dosyası kaldırılıyor çünkü çöp atma serin.
Son satır, mini betiğin bir parçası değildir, mini betiğin çalıştığını gösterir. Yukarıdaki 11 satırlı komut dosyası adı verilen bir rt.sh
dosyadaysa, chmod
çalıştırılabilir hale getirir ve çalıştırılır.
$ chmod +x rt.sh && ./rt.sh echo hello world
Tüm bunların sonucu, başlayan bir gnome terminali olacak görüntüler
hello world
ilk satırında ve sonra etkileşimli bir kabuk başlatır:
msw@myhost:~$