Çıktıyı komuttan (örn. Diff) bir değişkene kaydetme


21

diffHiçbiri varsa (dosyalar aynıysa test) herhangi bir çıktı olup olmadığını test etmek istiyorum echo "Passed $x" else echo "Failed $x". Bazı ara adımlarla çıktım (çıktıyı diff'den bir dosyaya kaydedin ve dosyadan okuyun)

diff "./helloworld$x.out" "./output/helloworld$x.out" > tmp.txt;
output="`cat tmp.txt`";

if [ "$output" = "" ];
  then
    echo "Passed $x";
  else
    echo "Failed $x";
  fi;

Kodun geliştirilebileceğinden eminim? Asıl soru: Çıktıyı diffdoğrudan değişkene kaydetmek mümkün müdür ?

Yanıtlar:


18

Bu çalışıyor:

eğer diff "./helloworld$x.out" "./output/helloworld$x.out"> / dev / null; sonra
    eko "$ x Geçti";
Başka
    echo "$ x başarısız oldu";
fi

Bunun yerine bir değişken kullanırsanız branche'ı echodüşürebilirsiniz else: değişkeni önce false olarak ayarlayın ifve 2 satırlık kodu kaydedin.

Eğer sonucu gerçekten değişken bir kullanıma koymak istiyorsanız:

some_var="$(diff "./helloworld$x.out" "./output/helloworld$x.out")"

Gerçekten işe yarayıp yaramadığını görmek için testime dahil etmek:

@ discworld rinzwind: ~ $ dokunuş 1
rinzwind @ discworld: ~ $ dokunma 2
rinzwind @ discworld: ~ $ daha fazla test
eğer fark 1 2> / dev / null; sonra
    eko "$ x Geçti";
Başka
    echo "$ x başarısız oldu";
fi
rinzwind @ discworld: ~ $ ./test
geçti 

rinzwind @ discworld: ~ $ vi 2
rinzwind @ discworld: ~ $ daha fazla 2
2
rinzwind @ discworld: ~ $ ./test
Başarısız oldu 

Parçada >/dev/null: >/dev/null 2>&1çıktıyı gönderir >/dev/nullve 2>&1 bu dosya önünde aynı dosyaya standart hatalar gönderir ( &1'ilk parametreyi kullan' anlamına gelir) (aynı zamanda kullanır /dev/null).

sidenote: sdiffyan yana difflisteleri gösterecek :

sdiff 1 2 
1 1
2 2
3 3
4 4
5 5
7 7
                                  > 8
9 9
10 10

Teşekkürler, işe yarıyor ama ... > /dev/nullbu bağlamda ne yaptığını anlamıyorum . Diff çıktısı goto / dev / null olacaktır, fakat hiçbir şey olmaz mı?
Jiew Meng

1
Dif, ekranınızdaki dosyalar arasındaki tüm farkları gösterecektir ve> / dev / null komutun çıktısının unutulmaya yönlendirilmesini sağlar. İf, çıktıya göre hala yürütülür.
Rinzwind

1
İf ifadesi, diff komutunun çıkış kodunu kontrol eder. 0, hiçbir fark bulunmadığı anlamına gelirken, 1, bir veya daha fazla fark olduğu anlamına gelir.
Knut Eldhuset

17

diff Aşağıdaki kodu kullanarak "Dosyalar / bin / bash ve / bin / sh fark" mesajı dışında çıktıyı tamamen bastırabilir.

file1="./helloworld$x.out"
file2="./output/helloworld$x.out"

if diff -q "$file1" "$file2"; then
    echo "Passed $x"
else
    echo "Failed $x"
fi

Bu mesajı bile gizlemek istiyorsan > /dev/null, çıktısını gizlemek için diff komutundan sonra eklemelisin diff:

if diff -q "$file1" "$file2" >/dev/null; then

/dev/null karadelik görevi gören özel bir dosyadır, eğer yazarsanız, gider, ondan okuyorsanız, hiçbir şey geri alamazsınız.

Bash'ın ;satır sonlandırmasına gerek olmadığını unutmayın .

Orijinal soruya gelince, bir programın çıktısını bir değişkene kaydetmek için:

file1="./helloworld$x.out"
file2="./output/helloworld$x.out"
output="$(diff -q "$file1" "$file2")"

# the quotes are mandatory, this checks whether $output is empty or not
if [ -n "$output" ]; then
    echo "Passed $x"
else
    echo "Failed $x"
fi

Bir değişkenin boş olup olmadığını kontrol etmenin alternatif yolları:

[ "$output" = "" ]
[ "$output" == "" ]
[[ "$output" == "" ]]
[[ $output == "" ]]

Bash kullanıyorsanız, dize karşılaştırması için son iki komut önerilir. Aksi takdirde, ilk ve [ -n "$output" ]tavsiye edilir.


6

a) Komut1'in çıktısı yakalanabilir

output=$(diff "helloworld$x.out" "output/helloworld$x.out") 

veya geri tepmelerle, ancak bunlar önerilmez, çünkü onları yuvalayamazsınız ve yazı tipine bağlı olarak kesme işaretlerinden ayırt etmek zor olabilir:

 output=`cmd1`

b) Bir dosyaya yazmak ve daha sonra bu dosyayı okumak, (ya da çıktıyı almak ve sonra yankı yapmak) doğrudan bir boru kullanırsınız:

 cmd1 > file
 cat file | cmd2 

 output=$(cmd1)
 echo "${output}" | cmd2 

=>

 cmd1 | cmd2 

ama örneğinizde çıktıya ilgi duymuyorsunuz, ancak programın sonucu - işe yaradı mı?

 diff "helloworld$x.out" "output/helloworld$x.out" && echo "success" || echo "failure" 

&& ve || "kısayol VE VE kısayolu VEYA" arayın.

Çıktıyı temiz tutmak için 'diff' çıktısını hiçbir yere yönlendirebilirsiniz:

 diff "helloworld$x.out" "output/helloworld$x.out" >/dev/null && echo "success" || echo "failure" 

Başarıyı yakalayıp daha sonra değerlendirmek için, son komutun sonucunu $ ?: değişkeninde saklarsınız.

diff "helloworld$x.out" "output/helloworld$x.out" >/dev/null
result=$?
# do something else
case $result in 
   0) echo success ;;
   *) echo failure ;;
esac

3

İki dosyanın aynı mı yoksa farklı mı olduğunu bilmek istiyorsanız (ancak farkın gerçekte ne olduğu ile ilgilenmiyorsanız), cmpdaha uygundur.

if cmp -s file1 file2; then echo "Equal"; else echo "Not equal"; fi
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.