GNU/Linux >> Belajar Linux >  >> Linux

Apa Itu Operator Kontrol Dan Pengalihan Shell?

Saya sering melihat tutorial online yang menghubungkan berbagai perintah dengan simbol yang berbeda. Misalnya:

command1 |  command2
command1 &  command2
command1 || command2    
command1 && command2

Yang lain tampaknya menghubungkan perintah ke file:

command1  > file1
command1  >> file1

Benda apa ini? Apa yang mereka sebut? Apa yang mereka lakukan? Apakah ada lebih banyak dari mereka?

Utas meta tentang pertanyaan ini..

Jawaban yang Diterima:

Ini disebut operator shell dan ya, ada lebih banyak dari mereka. Saya akan memberikan gambaran singkat tentang yang paling umum di antara dua kelas utama, operator kontrol dan operator pengalihan, dan bagaimana mereka bekerja sehubungan dengan bash shell.

A. Operator kontrol

Definisi POSIX

Dalam bahasa perintah shell, token yang menjalankan fungsi kontrol.
Ini adalah salah satu dari simbol berikut:

&   &&   (   )   ;   ;;   <newline>   |   ||

Dan |& di bash.

Sebuah ! adalah tidak operator kontrol tetapi Word yang Dicadangkan. Ini menjadi logika NOT [operator negasi] di dalam Ekspresi Aritmatika dan konstruksi pengujian di dalam (sementara masih membutuhkan pembatas spasi).

A.1 Daftar terminator

  • ; :Akan menjalankan satu perintah setelah yang lain selesai, terlepas dari hasil yang pertama.

    command1 ; command2
    

    command1 pertama dijalankan, di latar depan, dan setelah selesai, command2 akan dijalankan.

    Baris baru yang tidak ada dalam literal string atau setelah kata kunci tertentu adalah bukan setara dengan operator titik koma. Daftar ; perintah sederhana yang dibatasi masih merupakan daftar – seperti di shell parser masih harus terus membaca perintah sederhana yang mengikuti ; membatasi perintah sederhana sebelum dieksekusi, sedangkan baris baru dapat membatasi seluruh daftar perintah – atau daftar daftar. Perbedaannya tidak kentara, tetapi rumit:mengingat shell tidak memiliki keharusan sebelumnya untuk membaca data setelah baris baru, baris baru menandai titik di mana shell dapat mulai mengevaluasi perintah sederhana yang telah dibacanya, sedangkan ; titik koma tidak.

  • & :Ini akan menjalankan perintah di latar belakang, memungkinkan Anda untuk terus bekerja di shell yang sama.

     command1 & command2
    

    Di sini, command1 diluncurkan di latar belakang dan command2 mulai berjalan di latar depan segera, tanpa menunggu command1 untuk keluar.

    Baris baru setelah command1 adalah opsional.

A.2 Operator logika

  • && :Digunakan untuk membuat daftar AND, memungkinkan Anda menjalankan satu perintah hanya jika perintah lain berhasil keluar.

     command1 && command2
    

    Di sini, command2 akan dijalankan setelah command1 telah selesai dan hanya jika command1 berhasil (jika kode keluarnya adalah 0). Kedua perintah dijalankan di latar depan.

    Perintah ini juga dapat ditulis

    if command1
    then command2
    else false
    fi
    

    atau cukup if command1; lalu perintah2; fi jika status pengembalian diabaikan.

  • || :Digunakan untuk membuat daftar ATAU, memungkinkan Anda untuk menjalankan satu perintah hanya jika perintah lain tidak berhasil.

     command1 || command2
    

    Di sini, command2 hanya akan berjalan jika command1 gagal (jika mengembalikan status keluar selain 0). Kedua perintah dijalankan di latar depan.

    Perintah ini juga dapat ditulis

    if command1
    then true
    else command2
    fi
    

    atau dengan cara yang lebih pendek if ! perintah1; lalu perintah2; fi .

    Perhatikan bahwa && dan || adalah asosiatif kiri; lihat Prioritas operator logika shell &&, || untuk informasi lebih lanjut.

  • ! :Ini adalah kata khusus yang bertindak sebagai operator “bukan” (tetapi harus memiliki pembatas), digunakan untuk meniadakan status pengembalian suatu perintah — kembalikan 0 jika perintah mengembalikan status bukan nol, kembalikan 1 jika mengembalikan status 0 . Juga TIDAK logis untuk test utilitas.

    ! command1
    
    [ ! a = a ]
    

    Dan operator NOT sejati di dalam Ekspresi Aritmatika:

    $ echo $((!0)) $((!23))
    1 0
    

A.3 Operator pipa

  • | :Operator pipa, meneruskan output dari satu perintah sebagai input ke yang lain. Perintah yang dibuat dari operator pipa disebut pipeline.

     command1 | command2
    

    Keluaran apa pun yang dicetak oleh command1 diteruskan sebagai input ke command2 .

  • |& :Ini adalah singkatan dari 2>&1 | di bash dan zsh. Ini melewati keluaran standar dan kesalahan standar dari satu perintah sebagai masukan ke yang lain.

    command1 |& command2
    

A.4 Daftar tanda baca lainnya

;; digunakan semata-mata untuk menandai akhir dari pernyataan kasus. Ksh, bash dan zsh juga mendukung ;& untuk lolos ke kasus berikutnya dan ;;& (bukan dalam ATT ksh) untuk melanjutkan dan menguji kasus-kasus berikutnya.

Terkait:Daftar file yang diakses oleh suatu program?

( dan ) digunakan untuk mengelompokkan perintah dan meluncurkannya dalam subkulit. { dan } juga mengelompokkan perintah, tetapi jangan meluncurkannya dalam subkulit. Lihat jawaban ini untuk diskusi tentang berbagai jenis kurung, kurung, dan kurung kurawal dalam sintaksis shell.

B. Operator Pengalihan

Definisi POSIX dari Operator Pengalihan

Dalam bahasa perintah shell, token yang melakukan fungsi pengalihan. Ini adalah salah satu simbol berikut:

<     >     >|     <<     >>     <&     >&     <<-     <>

Ini memungkinkan Anda untuk mengontrol input dan output dari perintah Anda. Mereka dapat muncul di mana saja dalam perintah sederhana atau mungkin mengikuti perintah. Pengalihan diproses sesuai urutan kemunculannya, dari kiri ke kanan.

  • :Memberikan masukan ke suatu perintah.

    command < file.txt
    

    Di atas akan menjalankan command pada isi file.txt .

  • :sama seperti di atas, tetapi file terbuka di read+write mode alih-alih hanya-baca :

    command <> file.txt
    

    Jika file tidak ada, itu akan dibuat.

    Operator tersebut jarang digunakan karena perintah umumnya hanya membaca dari stdin mereka, meskipun itu bisa berguna dalam sejumlah situasi tertentu.

  • > :Mengarahkan output dari perintah ke dalam file.

    command > out.txt
    

    Di atas akan menyimpan output dari command sebagai out.txt . Jika file ada, isinya akan ditimpa dan jika tidak ada akan dibuat.

    Operator ini juga sering digunakan untuk memilih apakah sesuatu harus dicetak ke kesalahan standar atau keluaran standar:

    command >out.txt 2>error.txt
    

    Pada contoh di atas, > akan mengarahkan output standar dan 2> mengarahkan kesalahan standar. Output juga dapat diarahkan menggunakan 1> tetapi, karena ini adalah default, 1 biasanya dihilangkan dan ditulis hanya sebagai > .

    Jadi, untuk menjalankan command di file.txt dan simpan hasilnya di out.txt dan pesan kesalahan apa pun di error.txt Anda akan menjalankan:

    command < file.txt > out.txt 2> error.txt
    
  • >| :Apakah sama dengan > , tetapi akan menimpa target, meskipun shell telah dikonfigurasi untuk menolak penimpaan (dengan set -C atau set -o noclobber ).

    command >| out.txt
    

    Jika out.txt ada, output dari command akan menggantikan isinya. Jika tidak ada maka akan dibuat.

  • >> :Apakah sama dengan > , kecuali jika file target ada, data baru akan ditambahkan.

    command >> out.txt
    

    Jika out.txt ada, output dari command akan ditambahkan padanya, setelah apa pun yang sudah ada di dalamnya. Jika tidak ada maka akan dibuat.

  • >& :(per spesifikasi POSIX) ketika dikelilingi oleh digit (1>&2 ) atau - di sebelah kanan (1>&- ) hanya mengalihkan satu deskriptor file atau menutupnya (>&- ).

    Sebuah >& diikuti dengan nomor deskriptor file adalah cara portabel untuk mengarahkan ulang deskriptor file, dan >&- adalah cara portabel untuk menutup deskriptor file.

    Jika sisi kanan pengalihan ini adalah file, harap baca entri berikutnya.

  • >& , &> , >>& dan &>> :(baca juga di atas) Arahkan ulang kesalahan standar dan keluaran standar, masing-masing mengganti atau menambahkan.

    command &> out.txt
    

    Kesalahan standar dan keluaran standar command akan disimpan di out.txt , menimpa kontennya atau membuatnya jika tidak ada.

    command &>> out.txt
    

    Seperti di atas, kecuali jika out.txt ada, output dan kesalahan command akan ditambahkan ke dalamnya.

    &> varian berasal dari bash , sedangkan >& varian berasal dari csh (dekade sebelumnya). Keduanya bertentangan dengan operator shell POSIX lainnya dan tidak boleh digunakan dalam sh portable portabel skrip.

  • << :Sebuah dokumen di sini. Ini sering digunakan untuk mencetak string multi-baris.

     command << WORD
         Text
     WORD
    

    Di sini, perintah akan mengambil semuanya sampai menemukan kemunculan WORD berikutnya , Teks pada contoh di atas, sebagai input . Sedangkan WORD sering EoF atau variasinya, dapat berupa string alfanumerik (dan tidak hanya) yang Anda suka. Ketika WORD dikutip, teks dalam dokumen di sini diperlakukan secara harfiah dan tidak ada ekspansi yang dilakukan (pada variabel misalnya). Jika tidak dikutip, variabel akan diperluas. Untuk detail lebih lanjut, lihat manual bash.

    Jika Anda ingin menyalurkan output dari command < langsung ke perintah atau perintah lain, Anda harus meletakkan pipa pada baris yang sama dengan , Anda tidak dapat meletakkannya setelah WORD yang mengakhiri atau pada baris berikut. Misalnya:

     command << WORD | command2 | command3...
         Text
     WORD
    
  • :Di sini string, mirip dengan dokumen di sini, tetapi dimaksudkan untuk satu baris. Ini hanya ada di port Unix atau rc (tempat asalnya), zsh, beberapa implementasi ksh, yash, dan bash.

    command <<< WORD
    

    Apapun yang diberikan sebagai WORD diperluas dan nilainya diteruskan sebagai input ke command . Ini sering digunakan untuk meneruskan konten variabel sebagai input ke perintah. Misalnya:

     $ foo="bar"
     $ sed 's/a/A/' <<< "$foo"
     bAr
     # as a short-cut for the standard:
     $ printf '%sn' "$foo" | sed 's/a/A/'
     bAr
     # or
     sed 's/a/A/' << EOF
     $foo
     EOF
    

Beberapa operator lain (>&- , x>&y x<&y ) dapat digunakan untuk menutup atau menduplikasi deskriptor file. Untuk detailnya, silakan lihat bagian yang relevan dari manual shell Anda (di sini misalnya untuk bash).

Terkait:Bagaimana cara menunda ekspansi variabel?

Itu hanya mencakup operator paling umum dari cangkang mirip Bourne. Beberapa shell memiliki beberapa operator pengalihan tambahan sendiri.

Ksh, bash dan zsh juga memiliki konstruksi <(…) , >(…) dan =(…) (yang terakhir di zsh hanya). Ini bukan pengalihan, tetapi proses substitusi.


Linux
  1. Bagaimana Cara Mengatur Lokal Dan Apa Implikasinya?

  2. Apa itu Pemisah Kata Readline?

  3. Apa Hubungan Antara Terminal Pengontrol Saat Ini Dan `/ dev/tty`?

  1. Pengalihan Io Dan Perintah Kepala?

  2. Apa manfaat CloudLinux?

  3. Apa itu vdso dan vsyscall?

  1. Apa keuntungan (dis) dari ext4, ReiserFS, JFS, dan XFS?

  2. Apa itu program CLI standar untuk mengelola pengguna dan grup?

  3. Apa perbedaan fungsional antara .profile .bash_profile dan .bashrc