GNU/Linux >> Belajar Linux >  >> Linux

Bagaimana Mengirim Perintah ke Terminal Apa Pun?

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:

  1. menyalurkan perintah ke, misalnya, /tmp/termpipe-20140208-153029-1.sh
  2. membuat file dapat dieksekusi
  3. jalankan file di terminal yang sesuai
  4. 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.

Terkait:Linux – Wifi Arch linux bekerja secara manual, bagaimana membuatnya otomatis?

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

Linux
  1. Cara menggunakan perintah riwayat Bash

  2. Bagaimana cara menjalankan skrip .sh dari jalur mana pun di terminal?

  3. Bagaimana cara menilai batas pipa di bawah linux?

  1. Bagaimana Cara Mengirim Stdout Ke Beberapa Perintah?

  2. Bagaimana Mem-pipe Daftar Perintah yang Ditampilkan Oleh "tab Complete"?

  3. Bagaimana cara memeriksa HZ di terminal?

  1. Cara Menjalankan Perintah Linux di Latar Belakang

  2. Cara mengatur waktu sekelompok perintah di Bash

  3. Bagaimana cara menyalurkan perintah bersama dalam file preseed debian?