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
bash
shell-script
io-redirection
Herman Toothrot
sumber
sumber
Jawaban:
1>>
dan2>>
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, sebaliknyadi awal skrip.
sumber
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
sumber
Karena tidak ada parameter dalam memanggil skrip parameter
$1
dan$2
kosong dan begitu juga$jobout
dan$joberr
.Anda harus memanggil skrip seperti ini:
sumber
>>
operator redirection.