Genişleterek yeniden yönlendirmenin oluşmamasının nedeni , parametre genişletmeleri tarafından üretildikten sonra "$HideErrors"
gibi sembollerin >
özel olarak işlem görmemesidir . Bu aslında çok iyidir, çünkü bu semboller metinde görünür ve tam anlamıyla genişletmek ve kullanmak isteyebilirsiniz.
Bu, siz teklif edip etmediğinizi içerir $HideErrors
. Parametre genişletmenin sonucu, genişletme belirtilmediğinde sözcük bölme ve globbing işlemine tabidir , ancak hepsi bu kadar.
Bu konuda ne yapılacağı konusunda, koşullu yeniden yönlendirme elde etmenin birçok yolu vardır. Çok basit bir komut için, tüm komutu bir case
veya if
- else
yapının her dalına bir kez olmak üzere iki kez yazmak mantıklı olabilir . Ancak bu kısa sürede külfetli hale gelir ve gösterdiğiniz komut kesinlikle bunun ideal olmayacağı bir durumdur.
Kendinizi tekrar etmekten kaçınmanıza izin veren yaklaşımlardan, özellikle tavsiye ettiğim iki tane var, çünkü bunlar oldukça temiz ve doğru olması kolaydır. Aynı komut ve yönlendirme için bir kerede değil, bunlardan sadece birini kullanmak istersiniz.
Yönlendirme yerine komutu saklayın. Yönlendirmeyi bir değişkende depolamaya çalışmak ve parametre genişletmesini uygulamak yerine, komutu bir kabuk işlevinde saklayın . Daha sonra , bir daldaki yönlendirme ile ve diğer daldaki yönlendirme olmadan işlevin çağrıldığı bir case
veya if
- yazın else
.
Komutunuzu bir kez yazmak istediğiniz ancak birden fazla koşulda çalıştırmak istediğiniz kod olarak kavramsallaştırırsanız, bir işlev doğal çözümdür. Ben genellikle bunu yaparım. Ne bir alt kabuk ne de manuel depolama ve durumun sıfırlanması gerekmemektedir .
Kodunuzla:
launch() {
google-chrome --headless --disable-gpu --dump-dom \
"$RobWebAddress" > "$DownloadName"
}
case $fCron in
true) launch 2>/dev/null;;
*) launch;; # Get silly error messages when running from terminal
esac
İstediğiniz boşluğu veya isterseniz if
- uygulayabilirsiniz else
. Bash, dinamik olarak kapsamlandırılan çoğu programlama dilinin aksine, Bash dinamik olarak kapsamlandığından , launch
arayanın RobWebAddress
ve DownloadName
değişkenlerin otomatik olarak kullanıldığını unutmayın .
Komutu bir alt kabukta çalıştırın ve yeniden yönlendirmeyi şuraya uygulayın exec
. Bu ne hakkında yorumladı steeldriver ama içeride (
)
lokal etkisini tutmak . Ne zaman yerleşik bağımsız değişken olmadan çalıştırılır, yani yeni bir süreçle şimdiki kabuğu yerine, ancak bunun yerine geçerli kabuk onun yönlendirmeler herhangi geçerlidir etmez.exec
(Ayrıca, bir alt kabuk kullanmadan ve dolayısıyla mevcut kabuğun ortamını değiştirme yeteneğinden ödün vermeden standart hatanın ne olduğunu takip etmek ve geri yüklemek de mümkündür. Bununla birlikte, bunun ayrıntılarını diğer cevaplara bırakacağım.
Kodunuzla:
(
# Suppress silly error messages unless running from terminal
case $fCron in true) exec 2>/dev/null;; esac
google-chrome --headless --disable-gpu --dump-dom \
"$RobWebAddress" > "$DownloadName"
)
Kapanıştan sonra )
, standart hata aslında daha önce olduğu her şeye geri yüklenir, çünkü üst kabukta değil, yalnızca alt kabukta yeniden yönlendirilir. Alt kabuklar bunların bir kopyasını aldığından, bu da mevcut kabuk değişkenleriyle iyi çalışır. Bir kabuk işlevi kullanmayı tercih etsem de, bu yöntemin daha az kod gerektirebileceğini kabul ediyorum.
Her iki yöntem de, koşullu davranışı içeren kodu çağıran kabuk işlevlerine uygulanan yeniden yönlendirme ve standart hatanın tüm komut dosyası zaten bir önceki veya tarafından yönlendirilmişti . Yolun süreç ikamesi ile üretilmesi sorun değil.exec 2>&fd
exec 2> path
[[ $fCron == true ]] && exec 2>/dev/null
yerine deneyebilirsiniz