Komut satırında halihazırda belirli bir metin girişi olan bir terminal nasıl başlatılır?


25

Sorumu tekrar yazmak yerine, size istenen kullanıcı durumunu anlatayım:

"Gnome-terminal --someoptionflagname" gönderilecek metnimi "komutunu çalıştırmak için kısa bir shell-script oluşturun ve bu betiği yürütün.

Gnome-terminal açılır ve komut satırı istemiyle metnimin arkasına gelir.

yani: fields@mycomputer:/$ my text to be posted

Bu yapılabilir mi?


Eğer bu hata hiç Ubuntu sabittir içine bakmak gerekir cnee .
ændrük

@ ændrük Bu sabittir ve paket adı xneeşimdi.
tatlı

Yanıtlar:


32

Bekle ( yükleme ) ile bunu yapabilirsiniz . Oluşturun ve yürütülebilir hale getirin ~/bin/myprompt:

#!/usr/bin/expect -f

# Get a Bash shell
spawn -noecho bash

# Wait for a prompt
expect "$ "

# Type something
send "my text to be posted"

# Hand over control to the user
interact

exit

ve Gnome Terminali ile çalıştırın:

gnome-terminal -e ~/bin/myprompt

Beklentiyi kullanmak için + 1. Bunu yıllarca birçok şeyi otomatikleştirmek için kullandım.
Marco Ceppi

Bu havalı. Varsayılan gnome-terminal fonksiyonelliğine dayanan basit (ish) bir cevap olacağını umuyordum, fakat iş cevap veriyor gibi görünüyor.
emf

Bu beni çok uzun zamandır rahatsız ediyor, kullanım amacının ne olduğunu neredeyse hatırlayamadım. Bu yüzden, açıklama için: "GNOME -E ls" gibi bir şey yapmak isterdim, ama mandal, pencerenin açık kalmasını sağlamaktır. Yani, temelde bir terminal açmak ve çalışan kabuk komutlarını kısayollar. Bu, aendruk / msw'nin cevaplarına göre sorunları açıklaştırıyor mu?
emf

1
İstediğiniz tek şey komuttan sonra terminalin açık kalmasıysa, çok daha basit çözümler var .
ændrük

Süper teşekkürler. Bunu, Pentaho veri entegrasyon aracını çağıran bir kabuk betiğine başarıyla entegre ettim. Sonra bu betiğe çağrımı 11.10’daki Unity launcher’a ekledim ve bir çekicilik gibi çalışıyor.
bioShark

8

Doğru anlarsam, ilk giriş satırının gnome-terminal komut satırından geçtiğiniz içeriklere önceden doldurulmasını istersiniz.

Bunu kesinlikle bash ile nasıl yapacağımı bilmiyorum, ama işte yaklaşan bir şey. Kendinize ~/.bashrc, sonuna aşağıdaki satırı ekleyin:

history -s "$BASH_INITIAL_COMMAND"

Çalıştırın gnome-terminal -x env BASH_INITIAL_COMMAND='my text to be posted' bashve Upmetni çağırmak için komut isteminde tuşuna basın .

Ayrıca set -o history, sonundaki yorumları .bashrcizlerseniz, bash başlangıcı olarak tarihe gireceklerini, böylece bunları Upanahtarla ulaşarak ve ilk harfleri kaldırarak düzenleme için kullanabileceğinizi unutmayın #.


2
Aradığım çözüm tam olarak olmasa da, bu kendi başına ilginç.
emf

8

ændrük'ün önerisi benim için çok iyi ve işe yaradı, ancak komut senaryosunda kodlanmış ve terminal penceresini yeniden boyutlandırırsanız iyi çalışmaz. Kodunu temel olarak kullanarak, myprompt betiğini komutu argüman olarak gönderme özelliğini ekledim ve bu komut dosyası terminal penceresini yeniden boyutlandırmayı doğru şekilde işler.

#!/usr/bin/expect

#trap sigwinch and pass it to the child we spawned
#this allows the gnome-terminal window to be resized
trap {
 set rows [stty rows]
 set cols [stty columns]
 stty rows $rows columns $cols < $spawn_out(slave,name)
} WINCH

set arg1 [lindex $argv 0]

# Get a Bash shell
spawn -noecho bash

# Wait for a prompt
expect "$ "

# Type something
send $arg1

# Hand over control to the user
interact

exit

ve Gnome Terminali ile çalıştırın:

gnome-terminal -e "~/bin/myprompt \"my text to be posted\""

1

æ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.shdosyadaysa, 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:~$

Bence senaryonun küçültülebildiğini gnome-terminal -x sh -c "echo hello world; bash"düşünüyorum, ki soruyu sorduğunu sanmıyorum.
ændrük

Bu harika görünüyor. Burada neler olduğunu açıklayabilir misiniz?
emf

1
emfields: Senin için açıklamalıyım.
msn

1
harikasın. ek açıklamalar için teşekkürler, bu tür bir yardım, komut dosyası oluşturma ile engellemeyi daha kolay erişilebilir kılar
emf

0

Bunu çözmek için en çok sevdiğim iki cevap kullanıyor expectve bunu--init-file bayrak üzerinde shebang'da veya terminali çalıştırırken kullanmanızı tavsiye ediyorlar :

#!/bin/bash --init-file
commands to run

... ve şu şekilde çalıştırın:

xterm -e /path/to/script
# or
gnome-terminal -e /path/to/script
# or
the-terminal -e bash --init-file /path/to/script/with/no/shebang

expect Hedef ortamımda kurulup kurulmadığını kontrol edemem dışında muhtemelen daha iyi bir çözümdür (anahatlarımı açıklayacağım nedenlerle).

Bash en ile içine Sorun koştu --init-fileve gnome-terminal's --commandolarak kesmek bu init komut dosyalarını yürütülürken STDIN için erişimi yok kabuk çözmek için. Örneğin, kullanıcı girişi (ftp, telnet, vb.) Gerektiren bir şey çalıştırmak istersem, ancak üst kabuğu çalışıp çalışmayacaksa bırakın; Şimdiye kadar gördüğüm tek istisna ssh:

xterm -e /bin/bash --init-file <(echo 'ssh -X some-machine')

... ama ihtiyacım olan bu oyuncak örneğinden daha karmaşık. Her neyse, umarım --init-filebu soruyu okuyan herkes için bu şeyler yararlı olur.


-1

Yeni açılan bir terminalde bir komut çalıştırmak için -eveya -xargümanlarını kullanabilirsiniz , ancak tam olarak istediğiniz şey bu değil.


yakın, ama tam olarak aradığım şey değil. Bu durumda bir problem, yürütüldüğünde ve bittiğinde, terminalin derhal kapanmasıdır. Diyelim ki "ls ~ / notes" kısayolunu istiyorum, çıktıyı görmeden önce kapanacak.
emf

Eğer bunun için bir çözüm olsaydı, aradığım vakaların çoğunu çözerdi.
emf
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.