Apa arti `1 >>` dan `2 >>` dalam skrip bash?

15

Saya memiliki skrip bash berikut, dari apa yang saya mengerti >> digunakan untuk menambahkan output dari perintah ke file yang sudah ada alih-alih menimpa, tetapi apa yang dilakukannya dalam kasus ini? Script ini memanggil beberapa file exe untuk mengkonversi dari satu format ke format lainnya. Ada beberapa tahun untuk setiap file, sehingga loop melalui setiap file dengan melihat nama file. Juga ketika saya menjalankan skrip ini saya mendapatkan "pengalihan ambigu"

#!/bin/bash
source $HOME/.bashrc

jobout=${1}
joberr=${2}

# Set some paths and prefixes

yr_bgn=2000
yr_end=2000

yr=${yr_bgn}
pth_data='/mnt/'
pth_rst='/mnt/'



while [ ${yr} -le ${yr_end} ]
do
   ./executable1 ${pth_data}file${yr}-${yr}.nc ${yr} ${pth_rst} 1>> ${jobout} 2>> ${joberr}
   ./executable2 ${pth_data}file${yr}-${yr}.nc ${yr} ${pth_rst} 1>> ${jobout} 2>> ${joberr}
   ./executable3 ${pth_data}file${yr}-${yr}.nc ${yr} ${pth_rst} 1>> ${jobout} 2>> ${joberr}
   let yr=${yr}+1
done
Herman Toothrot
sumber
Bagaimana Anda menyebut skrip ini?
Hauke ​​Laging
kemungkinan duplikat pengalihan Ambigous dilakukan> $ 2
Hauke ​​Laging
@ HaukeLaging, tidak, tidak. Pertanyaannya sepertinya tentang sesuatu yang dekat, tetapi tidak sama
Romeo Ninov
@RomeoNinov Maukah Anda menjelaskan perbedaan yang relevan?
Hauke ​​Laging
@ HaukeLaging skrip disimpan dalam file .sh Saya cukup mengetik ./myscript.sh
Herman Toothrot

Jawaban:

19

1>>dan 2>>merupakan pengalihan untuk deskriptor file tertentu, dalam hal ini output standar (deskriptor file 1) dan kesalahan standar (deskriptor file 2).

Jadi skrip mengarahkan semua pesan "standar" ke ${jobout}dan semua pesan kesalahan${joberr} . Menggunakan >>dalam kedua kasus berarti semua pesan ditambahkan ke file masing-masing.

Perhatikan itu ${jobout}dan ${joberr}ambil nilainya dari dua parameter baris perintah ke skrip ( ${1}dan ${2}), jadi Anda perlu menentukan file yang ingin Anda gunakan untuk menyimpan pesan. Jika parameter tidak diberikan skrip akan menghasilkan pesan kesalahan "pengalihan ambigu" yang Anda lihat; skrip harus benar-benar memeriksa apakah parameter telah disediakan dan menghasilkan pesan kesalahan yang sesuai, sebaliknya

if [ -z "$1" -o -z "$2" ]; then
    echo "Log files for standard and error messages must be specified"
    echo "${0} msgfile errfile"
    exit 1
fi

di awal skrip.

Stephen Kitt
sumber
2

Dalam kasus Anda 1 >> tambahkan informasi dari penangan stdout saat ini ke file $ {jobout} 2 >> tambahkan informasi dari penangan stderr saat ini ke file $ {joberr}

jobout dan joberr adalah file, didefinisikan sebagai parameter skrip pertama dan kedua

Romeo Ninov
sumber
1

Karena tidak ada parameter dalam memanggil skrip parameter $1 dan $2kosong dan begitu juga $joboutdan $joberr.

Anda harus memanggil skrip seperti ini:

./myscript.sh file1 file2
Hauke ​​Laging
sumber
Nomor parameter tidak ada hubungannya dengan angka sebelum >>operator redirection.
Barmar
Sudahlah, saya melihat Anda menjawab bagian tentang pengalihan ambigu, bukan pertanyaan dalam judul. Anda mungkin harus membuat jawaban Anda lebih jelas tentang ini.
Barmar