Bir bash komut dosyasında `1 >>` ve `2 >>` ne anlama geliyor?


15

Ben anlıyorum aşağıdaki bash betiği var >> üzerine bir komutun çıktısını yazmak yerine mevcut bir dosyaya eklemek için kullanılır, ancak bu durumda ne yapıyor? Bu komut dosyası, bir biçimden diğerine dönüştürmek için bazı exe dosyalarını çağırıyor. Her dosya için uzun yıllar vardır, bu nedenle dosya adına bakarak her dosyada dolaşır. Ayrıca bu komut dosyasını çalıştırdığımda "belirsiz yönlendirme" alıyorum

#!/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

Bu senaryoya nasıl denir?
Hauke ​​Laging


@HaukeLaging, hayır değil. Soru yakın bir şeyle ilgili gibi görünüyor, ama aynı değil
Romeo Ninov

@RomeoNinov İlgili farkı açıklar mısınız?
Hauke ​​Laging

@HaukeKomutun çalıştırılması bir .sh dosyasına kaydedilir. Ben sadece ./myscript.sh yazıyorum
Herman Toothrot

Yanıtlar:


19

1>>ve 2>>belirli dosya tanımlayıcıları için yeniden yönlendirmelerdir, bu durumda standart çıktı (dosya tanımlayıcı 1) ve standart hata (dosya tanımlayıcı 2).

Böylece komut dosyası tüm "standart" iletileri ${jobout}ve tüm hata iletilerini yeniden yönlendiriyor ${joberr}. Kullanımı >>her iki durumda da tüm mesajlar, ilgili dosyalara eklenir anlamına gelir.

Bunu not edin ${jobout}ve ${joberr}değerlerini iki komut satırı parametresinden betiğe ( ${1}ve ${2}) götürün , böylece iletileri depolamak için kullanmak istediğiniz dosyaları belirtmeniz gerekir. Parametreler verilmezse, komut dosyası gördüğünüz "belirsiz yeniden yönlendirme" hata iletisini üretir; kod gerçekten parametrelerin sağlanmış olup olmadığını kontrol etmeli ve uygun bir hata mesajı üretmelidir, aksi takdirde

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

betiğin başında.


2

Durumunuz 1 >> mevcut stdout işleyicisinden bilgileri $ {jobout} 2 dosyasına ekleyin >> >> geçerli stderr işleyicisinden bilgileri $ {joberr} dosyasına ekleyin

jobout ve joberr, betiğin birinci ve ikinci parametresi olarak tanımlanan dosyalardır


1

Hiçbir parametre komut dizisini parametre çağrısında olduğundan $1ve $2bu yüzden boş ve vardır $joboutve $joberr.

Komut dosyasını şu şekilde çağırmalısınız:

./myscript.sh file1 file2

Parametre numaralarının, >>yeniden yönlendirme işleçlerinden önceki sayılarla ilgisi yoktur .
Barmar

Boş ver, görüyorum ki başlıktaki soruya değil, belirsiz yönlendirme hakkındaki kısma cevap veriyorsun. Muhtemelen bu konuda cevabınızı daha net hale getirmelisiniz.
Barmar
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.