Saya sering menggunakan lebih dari satu terminal (atau emulator terminal) sekaligus; dan sementara di X saya dapat menyalin-tempel perintah, selain tidak terlalu praktis, itu jelas tidak berfungsi pada TTY asli. Ide pertama yang muncul pada saya adalah sesuatu yang mirip:
command > /dev/sometty
Sayangnya, command
dijalankan sebelum itu disalurkan, dan tidak ada trik seperti echo `command`
akan berfungsi, tidak peduli berapa banyak karakter bash yang aneh ($
, `
, "
, dll.) ada. Jadi /dev/sometty
hanya mendapatkan beberapa teks.
Masalahnya adalah, terkadang, saya perlu menyalurkan perintah-perintah itu ke dalam file, membuatnya dapat dieksekusi, dll., atau segera:membuat skrip dan menjalankannya dari terminal yang sesuai. Tapi itu banyak pekerjaan. Saya sudah berpikir untuk membuat skrip untuk membuat file-file ini, untuk instruksi:
termpipe -e "command1\ncommand2\"command 1 argument\\n(s)\"" -t /dev/sometty
itu akan melakukan sesuatu seperti:
- menyalurkan perintah ke, misalnya,
/tmp/termpipe-20140208-153029-1.sh
- membuat file dapat dieksekusi
- jalankan file di terminal yang sesuai
- hapus skrip setelah selesai dieksekusi
AFAIK, masalahnya ada di 3. :ini tidak menyelesaikan masalah apa pun, karena saya membutuhkan termpipe
lain contoh untuk menjalankan yang pertama di terminal yang sesuai. Dan satu untuk yang itu. Dan satu lagi untuk itu, ad infinitum . Jadi ini tidak bisa bekerja. Atau bisa?…
Solusinya bisa menggunakan pipa bernama per terminal, dan ketika masing-masing dimulai, skrip akan memberi tahu pipa untuk meneruskan apa pun yang diterimanya ke terminal, dan kemudian menjalankannya (seperti semacam daemon ).
Saya pikir ini mungkin berhasil tetapi saya tidak tahu cara mengatur skrip awal. Bagaimana bisa saya? Bagaimana saya bisa memberi tahu FIFO untuk memberikan perintah pipa untuk menjalankan terminal masing-masing? Saya tidak tahu banyak tentang Bash, jadi saya menghargai penjelasan lengkapnya.
Jawaban yang Diterima:
Setelah ini, seseorang dapat membuat rencana terakhir Anda berhasil. Agar perintah yang akan dikirim tidak diproses oleh shell, maka harus berupa string ketika mencapai pipa (dengan demikian echo "command"
, bukan echo `command`
). Maka itu harus dibaca oleh proses latar belakang (seperti daemon , tetapi tidak harus) dimulai di terminal yang sesuai. Itu harus dievaluasi dengan proses yang sama.
Tapi itu boiler-platey untuk memiliki skrip per pipa. Jadi mari kita generalisasikan pembuatan skrip sebagai term-pipe-r.sh
(jangan lupa untuk chmod +x
itu!):
#!/bin/bash
pipe=$1 # the pipe name is the first argument
trap 'rm -f "$pipe"' EXIT # ignore exit and delete messages until the end
if [[ ! -p $pipe ]]; then # if the pipe doesn't exist, create it
mkfifo $pipe
fi
while true # cycle eternally..
do
if read line <$ pipe; then
if [[ "$line" == 'close the term-pipe pipe' ]]; then
break
# if the pipe closing message is received, break the while cycle
fi
echo # a line break should be used because of the prompt
eval $line # run the line: as this script should be started
fi # in the target terminal,
done # the line will be run there.
echo "<pipe closing message>" # custom message on the end of the script
Jadi katakan Anda ingin /dev/tty3
untuk menerima perintah:pergi saja ke sana, lakukan
./term-pipe-r.sh tty3pipe & # $1 will be tty3pipe (in a new process)
Dan untuk mengirim perintah, dari terminal mana saja (bahkan dari dirinya sendiri):
echo "command" > tty3pipe
atau untuk menjalankan file di sana:
cat some-script.sh > tty3pipe
Perhatikan bahwa pemipaan ini mengabaikan file seperti .bashrc
, dan alias di sana, seperti alias ls='ls --color'
. Semoga ini bisa membantu seseorang di luar sana.
Edit (catatan – keuntungan dari non-daemon ):
Di atas saya berbicara tentang pembaca pipa yang bukan daemon tentu saja, tetapi pada kenyataannya, saya memeriksa perbedaannya, dan ternyata jauh lebih baik untuk menjadi proses latar belakang belaka dalam kasus ini. Karena dengan cara ini, ketika Anda menutup terminal, sebuah EXIT
sinyal (SIGHUP
, SIGTERM
, atau apa pun) diterima oleh skrip juga, dan pipa kemudian dihapus (lihat baris yang dimulai dengan trap
dalam skrip) secara otomatis, menghindari proses dan file yang tidak berguna (dan mungkin yang lain jika ada pengalihan seperti itu ke pipa yang tidak berguna).
Edit (otomatisasi):
Tetap saja, membosankan harus menjalankan skrip yang mungkin paling Anda inginkan (setidaknya saya) sepanjang waktu. Jadi, mari kita otomatisasi! Itu harus dimulai di terminal mana pun, dan satu hal yang semuanya dibaca adalah .bashrc
. Plus, itu menyebalkan harus menggunakan ./term-pipe-r.sh
. Jadi, seseorang dapat melakukannya:
cd /bin # go to /bin, where Bash gets command names
ln -s /directory/of/term-pipe-r.sh tpr # call it tpr (terminal pipe reader)
Sekarang untuk menjalankannya Anda hanya perlu tpr tty3pipe &
di /dev/tty3
kapan pun Anda mau. Tetapi mengapa melakukan itu ketika Anda dapat melakukannya secara otomatis? Jadi ini harus ditambahkan ke .bashrc
. Tapi tunggu:bagaimana dia bisa tahu nama pipanya? Itu dapat mendasarkan nama pada TTY (yang dapat diketahui dengan tty
perintah), menggunakan REGEX sederhana di sed
(dan beberapa trik). Apa yang harus Anda tambahkan ke ~/.bashrc
maka akan menjadi:
pipe="$(sed 's/\/dev\///' <<< `tty` | sed 's/\///')pipe"
# ^^^- take out '/dev/' and other '/', add 'pipe'
tpr $pipe & # start our script with the appropriate pipe name