Pertanyaan Apa perbedaan antara &> dan 2> & 1


Ada dua bentuk pengalihan keluaran standar dan kesalahan standar ke keluaran standar. Tapi yang mana yang lebih baik? dan mengapa &> dianggap sempurna?

Saya tidak dapat menemukan apa perbedaannya sehingga banyak tutorial dan bahkan bash menyatakan manual itu &> lebih baik!

Jadi, mengapa saya harus menggunakannya &> dan tidak 2>&1

Terutama menggunakan bash kulit


EDIT: Terima kasih atas komentator

Hanya> & berfungsi di csh atau tcsh

Di ksh hanya 2> & 1 berfungsi.

gunakan dash> file 2> & 1 redirection saja

Lalu yang mana yang digunakan untuk memastikan skrip saya kompatibel dengan sistem lain, apa pun cangkang yang digunakan!


20
2018-06-11 10:30


asal


yang lebih baik adalah apa yang harus Anda lakukan. ini melakukan hal-hal yang sangat berbeda. shell mana yang kamu gunakan? - Skaperen
@Skaperen menggunakan bash - Maythux
apa yang dilakukan kamu ingin capai? - Skaperen
Saya hanya ingin tahu apa perbedaannya, Apa yang saya inginkan adalah tidak di kedua tetapi saya hanya perlu tahu apakah perbedaannya sehingga sekali adalah preffred atas yang lain - Maythux
&> somewhere hanya bash singkatan untuk > somewhere 2>&1: dalam kata-kata manual bash, mereka "Sederhananya setara" - steeldriver


Jawaban:


Halaman manual Bash menyebutkan ada dua cara untuk mengalihkan stderr dan stdout: &> file  dan >& file. Sekarang, perhatikan bahwa itu mengatakan baik stderr dan stdout.

Dalam hal ini >file 2>&1 kami melakukan redirection of stdout (1) untuk file, tetapi kemudian juga memberitahu stderr (2) untuk dialihkan ke tempat yang sama dengan stdout! Jadi tujuannya mungkin sama, tetapi gagasannya sedikit berbeda. Dengan kata lain "John, pergi ke sekolah; Suzzie pergi ke mana John pergi".

Bagaimana dengan preferensi? &> adalah bash benda. Jadi jika Anda membuat skrip, itu tidak akan berhasil. Tetapi jika Anda 100% yakin skrip Anda hanya akan berfungsi pada sistem dengan bash - maka tidak ada preferensi

Berikut ini contohnya dengan dash , Shell Debian Amquist yang merupakan bawaan Ubuntu.

$ grep "YOLO" * &> /dev/null
$ grep: Desktop: Is a directory
grep: Documents: Is a directory
grep: Downloads: Is a directory
grep: Music: Is a directory
grep: Pictures: Is a directory
grep: Public: Is a directory
grep: Templates: Is a directory
grep: Videos: Is a directory
grep: YOLO: Is a directory
grep: bin: Is a directory

Seperti yang Anda lihat, stderr tidak sedang dialihkan

Untuk mengatasi pengeditan Anda dalam pertanyaan, Anda dapat menggunakan pernyataan jika untuk memeriksa variabel SHELL $ dan mengubah pengalihan sesuai

Tetapi untuk sebagian besar kasus > file 2>&1 harus bekerja


Dalam istilah yang lebih teknis, formulir [integer]>&word disebut Duplicating Output File Descriptor, dan merupakan fitur yang ditentukan oleh standar Bahasa Komando Shell POSIX, yang didukung oleh sebagian besar shell POSIX-compliant dan Brourne-like.

Lihat juga Apa yang dimaksud & berarti tepatnya dalam pengalihan output?


16
2018-06-11 10:50



Lalu apa yang terjadi ketika menggunakan beberapa shell lainnya? - Maythux
zsh mendukung &> .... @Maythux Dalam cangkang yang tidak mendukung &> misalnya dash Anda perlu menggunakan hal-hal sepele >file 2>&1 pengalihan .. - heemayl
Lalu Mana yang akan digunakan jika saya ingin memastikan skrip saya akan kompatibel dengan cangkang yang berbeda - Maythux
@Maythux Gunakan >file 2>&1 . Ini bekerja pada semua cangkang - Sergiy Kolodyazhnyy
@ TSJNachos117 kerang diatur masuk /etc/passwd untuk setiap pengguna adalah shell interaktif. Skrip sistem biasanya untuk dash  kecuali ditentukan. Adapun apa yang default, itu ditentukan oleh apa yang symlinked ke /bin/sh Dalam kasus Ubuntu itu dash. Di RHEL ini bash, di FreeBSD itu tcsh  sumber dan sumber lain - Sergiy Kolodyazhnyy


Saya biasanya merekomendasikan mengikuti cara Borne SHell dalam melakukan berbagai hal, karena bash adalah perangkat Unix yang paling populer di luar sana. Bash biasanya menggunakan keduanya &> atau 2>&1. IMHO, tidak juga "sempurna", jadi saya sarankan melupakan omong kosong itu. Secara realistis, yang mana yang harus Anda gunakan tergantung pada apa yang Anda coba lakukan.

2>&1 menggabungkan stderr dengan stdout, yang dapat berguna jika, misalnya, Anda ingin men-pipe teks stderr. Jadi, misalnya, jika Anda ingin melihat apakah suatu program mencetak pesan stderr tertentu, tetapi tidak ingin layar Anda dipenuhi dengan (mungkin) sampah yang tidak penting, Anda dapat melakukan sesuatu seperti program 2>&1 | grep crashed, yang akan mencari stdout dan stderr dari program yang disebut "program" untuk kata "crash".

Di sisi lain, jika Anda tidak ingin suatu program mencetak apa pun, Anda bisa langsung menjalankannya program &> /dev/null, yang akan mengarahkan kedua stderr dan stdout ke / dev / null, file khusus yang secara ajaib membuat semuanya menghilang. Atau, jika Anda ingin menyimpan output dari suatu program (mungkin melaporkan bug atau sesuatu), Anda dapat mengarahkan kembali stderr dan stdout ke file: program &> log.txtakan mengarahkan semua data ke file bernama "log.txt". Jika Anda ingin, Anda bisa mengarahkan ulang stdout dan stderr via program 2> log.txt > log.txt atau program 2>&1 | cat > log.txt, keduanya akan memiliki efek yang sama dengan yang digunakan &>. Jika Anda melakukan sesuatu seperti itu program 2>&1 > file, hanya stdout yang akan dialihkan, tetapi stderr masih bisa disalurkan ke program lain, seperti kucing, yang dapat dialihkan seperti yang ditunjukkan di atas. Namun, mengetik &> lebih mudah daripada contoh-contoh di atas, karena melibatkan pengetikan karakter yang lebih sedikit (dan itu sedikit lebih mudah bagi manusia untuk membaca). Perhatikan itu program 2> log.txt > log.txt mungkin lebih mungkin untuk bekerja pada shell non-bash.

PS: jika Anda khawatir tentang orang yang menggunakan shell lain, ada sesuatu yang dapat Anda tambahkan untuk menjadi baris pertama skrip Anda yang disebut "angka ajaib", atau "shebang". Ini pada dasarnya adalah cara untuk memastikan komputer lain (terutama yang menjalankan sistem operasi mirip Unix) tahu program mana yang digunakan untuk menjalankan skrip. Skrip yang berbeda menggunakan shebang yang berbeda. Sebuah shebang untuk skrip bash terlihat seperti ini:

#!/bin/bash

Jika Anda menggunakan di atas sebagai baris pertama dari skrip yang diberikan, bash umumnya akan digunakan untuk menjalankan skrip tersebut. Ini akan membuat jauh lebih sulit bagi seseorang untuk secara tidak sengaja mengeksekusi skrip dengan shell yang salah.

PS: Saya tidak akan berbohong: sampai sekarang, saya tidak tahu yang bisa digunakan >&, tetapi, sejauh bash pergi, tampaknya melakukan hal yang sama &>. Anda belajar sesuatu yang baru setiap hari.


4
2017-07-17 01:37



Sementara saya setuju dengan Anda tentang penggunaan #! baris untuk secara eksplisit meminta bash , itu tidak selalu tersedia di sistem lain. Sangat sering pengembang / sysadmin harus menulis skrip portabel untuk sistem yang mana bash mungkin tidak tersedia dan mungkin tidak di bawah kendali mereka untuk menginstal bash . Itu >file 2>&1 hanya jauh portabel. - Sergiy Kolodyazhnyy
Anda membuat kesalahan pembalikan di atas, yang tidak menghasilkan hasil yang Anda klaim atau inginkan. Redirect stderr ke stdout, kemudian redirect stdout meninggalkan stderr pada stdout asli. - ubfan1
Serg: Saya tidak bermaksud menyiratkan bahwa itu universal. Namun, saya pikir lebih banyak orang menggunakannya daripada mengatakan (t) csh. Jika Anda tidak tahu apa yang orang lain gunakan, dan harus membuat tebakan, bash mungkin adalah taruhan terbaik Anda. Juga, saya biasanya tidak tahu tentang portabilitas, karena saya hanya menggunakan bash. Fakta bahwa >file 2>&1 lebih portabel baik untuk diketahui. Saya akan membuat pengeditan untuk mencerminkan itu. - TSJNachos117
Ubfan1, terima kasih atas info. Saya tidak akan pernah menduga dalam jutaan tahun bahwa bash tidak akan mengarahkan stderr ke file dalam kasus itu. Saya baru saja mengedit jawaban saya untuk mencegah orang lain melakukan kesalahan yang sama. - TSJNachos117


Dari Bash Reference Manual -> 3.6.4 Mengarahkan Output Standar dan Kesalahan Standar:

Konstruksi ini memungkinkan output standar (file descriptor 1) dan   output standard error (file descriptor 2) untuk dialihkan ke   file yang namanya adalah perluasan kata.

Ada dua format untuk mengarahkan output standar dan standar   kesalahan:

&>word

dan

>&word

Dari dua bentuk itu, yang pertama lebih disukai. Ini semantik   setara dengan

>word 2>&1

Saat menggunakan bentuk kedua, kata mungkin tidak meluas ke angka atau ‘-’. Jika   itu, operator redirection lain berlaku (lihat Duplicating File   Deskriptor di bawah ini) untuk alasan kompatibilitas.

Juga bagus untuk disebut Wiki Greg pada Input dan Output -> 4.2. Manipulasi Berkas Descriptor:

Untuk kenyamanan, Bash juga membuat bentuk pengalihan lain   tersedia untuk Anda. Operator pengalihan & sebenarnya hanya a   versi lebih pendek dari apa yang kami lakukan di sini [ 2>&1 ]; mengarahkan keduanya   stdout dan stderr ke file.


3
2018-06-11 14:16





Jadi, mengapa saya harus menggunakan &> dan bukan 2> & 1

2>&1 adalah standar Bourne / POSIX shell.

&> adalah ekstensi bash dan tidak de jure standar.

Jika Anda menulis skrip menggunakan ekstensi bash, cepat atau lambat Anda akan mengalami kegagalan menggaruk-garuk dengan pesan kesalahan sintaksis yang samar karena dijalankan dalam shell standar.


3
2017-07-23 03:17