Bagaimana cara memulai terminal dengan teks tertentu yang sudah dimasukkan pada baris perintah?

25

Daripada mengulangi pertanyaan saya, izinkan saya menjelaskan kepada Anda kasus pengguna yang diinginkan:

Saya membuat skrip shell pendek untuk menjalankan perintah "gnome-terminal --someoptionflagname 'teks saya untuk diposting'", dan jalankan skrip ini.

Gnome-terminal muncul, dengan prompt baris perintah diikuti oleh teks saya.

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

Bisakah ini dilakukan?

ggl
sumber
Jika bug ini pernah diperbaiki di Ubuntu Anda harus melihat ke cnee .
ændrük
@ ændrük Sudah diperbaiki dan nama paketnya xneesekarang.
hidangan penutup

Jawaban:

32

Anda dapat melakukan ini dengan ekspektasi ( instal ). Buat dan buat dapat dieksekusi ~/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

dan jalankan Terminal Gnome dengan:

gnome-terminal -e ~/bin/myprompt
ændrük
sumber
+1 untuk menggunakan Harapkan. Saya telah menggunakan ini selama bertahun-tahun untuk membantu mengotomatisasi banyak hal.
Marco Ceppi
Ini keren. Saya berharap akan ada beberapa (ish) jawaban sederhana berdasarkan fungsionalitas terminal-gnome default, tetapi sepertinya ini menjawab pekerjaan.
emf
Yang ini telah menggangguku begitu lama, aku hampir tidak ingat apa yang dimaksud dengan use-case. Jadi, untuk klarifikasi: Saya ingin melakukan sesuatu seperti "gnome-terminal -e ls", tetapi tujuannya adalah agar jendela tetap terbuka. Jadi, pada dasarnya pintasan untuk membuka terminal dan menjalankan perintah shell. Apakah ini mengklarifikasi masalah vs jawaban aendruk / msw?
emf
1
Jika yang Anda inginkan adalah terminal tetap terbuka setelah perintah, ada solusi yang lebih sederhana .
ændrük
Super, terima kasih. Saya telah berhasil mengintegrasikan ini ke dalam skrip shell yang memanggil panggilan alat integrasi data Pentaho. Kemudian saya menambahkan panggilan ke skrip ini ke peluncur Unity di 11.10, dan berfungsi seperti pesona.
bioShark
8

Jika saya mengerti dengan benar, Anda ingin jalur input pertama Anda diisi dengan isi yang Anda lewati pada baris perintah terminal gnome.

Saya tidak tahu bagaimana melakukan ini dengan bash, tapi ada sesuatu yang dekat. Di Anda ~/.bashrc, tambahkan baris berikut di bagian paling akhir:

history -s "$BASH_INITIAL_COMMAND"

Jalankan gnome-terminal -x env BASH_INITIAL_COMMAND='my text to be posted' bash, dan tekan Upsaat diminta untuk memanggil kembali teks.

Perhatikan juga bahwa jika Anda meletakkan set -o historydiikuti oleh komentar di akhir Anda .bashrc, mereka akan dimasukkan ke dalam sejarah sebagai bash dimulai, sehingga Anda dapat menggunakannya sebagai dasar untuk mengedit dengan menjangkau mereka dengan Upkunci dan menghapus yang awal #.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
2
Meskipun bukan solusi yang saya cari, ini menarik dengan sendirinya.
emf
8

Saran ændrük sangat baik dan bekerja untuk saya, namun perintah tersebut di-hardcod dalam skrip, dan jika Anda mengubah ukuran jendela terminal, itu tidak berfungsi dengan baik. Menggunakan kode-nya sebagai basis, saya telah menambahkan kemampuan untuk mengirim skrip myprompt perintah sebagai argumen, dan skrip ini dengan benar menangani mengubah ukuran jendela terminal.

#!/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

dan jalankan Terminal Gnome dengan:

gnome-terminal -e "~/bin/myprompt \"my text to be posted\""
Gordon McCreight
sumber
1

Jawaban ændrük baik-baik saja, tetapi mungkin sedikit berat untuk tugas itu.

Berikut adalah skrip yang menulis skrip berdasarkan argumennya

#!/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

Jika Anda tidak melakukan banyak pemrograman shell, tampaknya ada lebih banyak keajaiban di sini daripada yang ada. Pertama, saya beri nama file sementara untuk menyimpan skrip di mana $$proses ID dari shell menjalankan skrip ini. The /tmp/something.$$metafora digunakan dalam kasus dua contoh dari script ini dijalankan pada saat yang sama, mereka tidak akan mencoba untuk menggunakan file sementara yang sama.

Variabel $SHELLdiatur ke nama shell yang menjalankan skrip. Jika Anda menggunakan / usr / bin / bash, mungkin Anda ingin skrip mini juga menggunakannya.

Ini "$@"adalah idiom shell untuk "menginterpolasi semua argumen saya, mengutipnya jika diperlukan". Sintaksis yang aneh ini menyebabkan

script.sh 'my file' your\ file

untuk menginterpolasi argumen sebagai dua elemen

"my file" "your file"

bukannya empat yang $@akan menghasilkan

"my" "file" "your" "file"

Baris terakhir skrip mengatur terminal gnome untuk mulai menjalankan skrip mini dan kemudian memulai shell interaktif. Ketika terminal gnome keluar, skrip sementara dihapus karena membuang sampah sembarangan.

Baris terakhir bukan merupakan bagian dari skrip mini, ini menunjukkan bahwa skrip mini berfungsi. Jika 11 baris skrip di atas adalah dalam sebuah file bernama rt.shmaka chmodmembuatnya dapat dieksekusi dan kemudian dieksekusi.

$ chmod +x rt.sh && ./rt.sh echo hello world

Hasil dari semua ini akan menjadi terminal gnome yang mulai, menampilkan

hello world

pada baris pertama dan kemudian memulai shell interaktif:

msw@myhost:~$
msw
sumber
Saya pikir skrip Anda dapat dikurangi menjadi gnome-terminal -x sh -c "echo hello world; bash", yang menurut saya pertanyaannya tidak diajukan.
ændrük
Ini terlihat keren. Bisakah Anda jelaskan apa yang terjadi di sini?
emf
1
emfields: Saya memberi keterangan untuk Anda.
msw
1
kamu keren. terima kasih untuk anotasi, bantuan semacam ini membuat penghalang untuk masuk dengan skrip jauh lebih mudah diakses
emf
0

Dua jawaban yang paling saya sukai untuk menyelesaikan ini adalah menggunakan expectdan yang ini di mana mereka merekomendasikan menggunakan --init-filebendera baik di shebang atau ketika menjalankan terminal:

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

... dan jalankan sebagai:

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 mungkin solusi yang lebih baik (untuk alasan saya akan menguraikan), kecuali bahwa saya tidak dapat mengontrol apakah itu diinstal di lingkungan target saya.

Masalahnya aku berlari ke dalam dengan bash --init-filedan gnome-terminal's --commandsebagai hack untuk mengatasi ini adalah shell tidak memiliki akses ke STDIN ketika menjalankan skrip init. Jika, misalnya, saya ingin menjalankan sesuatu yang memerlukan input pengguna (ftp, telnet, dll) tetapi biarkan shell induk berjalan setelah itu tidak akan berfungsi; satu-satunya pengecualian yang saya lihat sejauh ini adalah ssh:

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

... tapi yang saya butuhkan lebih rumit dari contoh mainan ini. Ngomong-ngomong, saya berharap --init-filehal ini bermanfaat bagi siapa pun yang membaca pertanyaan ini.

Brian Vandenberg
sumber
-1

Anda dapat menggunakan argumen -eatau -xuntuk menjalankan perintah di dalam terminal yang baru muncul, tapi itu tidak persis seperti yang Anda inginkan.

Karl Bielefeldt
sumber
dekat, tapi tidak cukup apa yang saya cari. Satu masalah, untuk kasus ini, adalah bahwa ketika dieksekusi dan selesai, terminal akan segera ditutup. Jadi, katakanlah saya ingin pintasan ke "ls ~ / notes", itu akan ditutup sebelum saya dapat melihat hasilnya.
emf
Jika ada solusi untuk ini, itu akan menyelesaikan sebagian besar kasus yang saya cari.
emf