Yönlendirme hakkında bazı püf noktaları
Bununla ilgili bazı sözdizimi özelliğinin önemli davranışları olabilir. Yönlendirmeler, hakkında bazı küçük örnekler vardır STDERR, STDOUTve argümanlar sipariş .
1 - Üzerine mi yazıyor yoksa eklensin mi?
Sembol >ortalama yeniden yönlendirme .
>tamamlanmış bir dosya olarak göndermek , varsa hedefin üzerine yazmak anlamına gelir ( daha sonra # 3'tekinoclobber bash özelliğine bakın ).
>>Ortalama ek olarak gönderme için exist eğer hedef bilgisini ekleyecektir.
Her halükarda, dosya mevcut değilse oluşturulur.
2 - Kabuk komut satırı sıraya bağlıdır !!
Bunu test etmek için , her iki çıktıda da bir şey gönderecek basit bir komuta ihtiyacımız var :
$ ls -ld /tmp /tnt
ls: cannot access /tnt: No such file or directory
drwxrwxrwt 118 root root 196608 Jan 7 11:49 /tmp
$ ls -ld /tmp /tnt >/dev/null
ls: cannot access /tnt: No such file or directory
$ ls -ld /tmp /tnt 2>/dev/null
drwxrwxrwt 118 root root 196608 Jan 7 11:49 /tmp
( /tntElbette adında bir dizininiz olmaması bekleniyor ;). Peki, bizde var !!
Bakalım:
$ ls -ld /tmp /tnt >/dev/null
ls: cannot access /tnt: No such file or directory
$ ls -ld /tmp /tnt >/dev/null 2>&1
$ ls -ld /tmp /tnt 2>&1 >/dev/null
ls: cannot access /tnt: No such file or directory
Son komut satırı STDERRkonsola atıyor ve beklenen davranış gibi görünmüyor ... Ama ...
Bir çıktı, diğeri ya da her ikisi hakkında bir post filtre uygulamak istiyorsanız :
$ ls -ld /tmp /tnt | sed 's/^.*$/<-- & --->/'
ls: cannot access /tnt: No such file or directory
<-- drwxrwxrwt 118 root root 196608 Jan 7 12:02 /tmp --->
$ ls -ld /tmp /tnt 2>&1 | sed 's/^.*$/<-- & --->/'
<-- ls: cannot access /tnt: No such file or directory --->
<-- drwxrwxrwt 118 root root 196608 Jan 7 12:02 /tmp --->
$ ls -ld /tmp /tnt >/dev/null | sed 's/^.*$/<-- & --->/'
ls: cannot access /tnt: No such file or directory
$ ls -ld /tmp /tnt >/dev/null 2>&1 | sed 's/^.*$/<-- & --->/'
$ ls -ld /tmp /tnt 2>&1 >/dev/null | sed 's/^.*$/<-- & --->/'
<-- ls: cannot access /tnt: No such file or directory --->
Bu paragraftaki son komut satırının, önceki yazımdakiyle tamamen aynı olduğuna dikkat edin, burada yazdım , beklenen davranış gibi görünmüyor (bu nedenle, bu beklenen bir davranış olabilir).
Her iki çıktıda da farklı işlemler yapmak için yönlendirmelerle ilgili küçük hileler var
:
$ ( ls -ld /tmp /tnt | sed 's/^/O: /' >&9 ) 9>&2 2>&1 | sed 's/^/E: /'
O: drwxrwxrwt 118 root root 196608 Jan 7 12:13 /tmp
E: ls: cannot access /tnt: No such file or directory
Not: &9tanımlayıcı kendiliğinden gerçekleşir ) 9>&2.
Zeyilname: nota! Yeni sürümü iledarbe( >4.0) bu tür şeyleri yapmak için yeni bir özellik ve daha seksi sözdizimi var:
$ ls -ld /tmp /tnt 2> >(sed 's/^/E: /') > >(sed 's/^/O: /')
O: drwxrwxrwt 17 root root 28672 Nov 5 23:00 /tmp
E: ls: cannot access /tnt: No such file or directory
Ve son olarak böyle bir basamaklı çıktı biçimlendirmesi için:
$ ((ls -ld /tmp /tnt |sed 's/^/O: /' >&9 ) 2>&1 |sed 's/^/E: /') 9>&1| cat -n
1 O: drwxrwxrwt 118 root root 196608 Jan 7 12:29 /tmp
2 E: ls: cannot access /tnt: No such file or directory
Zeyilname: nota! Her iki yönde de aynı yeni sözdizimi:
$ cat -n <(ls -ld /tmp /tnt 2> >(sed 's/^/E: /') > >(sed 's/^/O: /'))
1 O: drwxrwxrwt 17 root root 28672 Nov 5 23:00 /tmp
2 E: ls: cannot access /tnt: No such file or directory
STDOUTBelirli bir filtreden geçtiği yerde , STDERRdiğerine ve son olarak her iki çıkış da üçüncü bir komut filtresinden geçer.
3 - noclobberSeçenek ve >|sözdizimi hakkında bir kelime
Üzerine yazmakla ilgili :
İken set -o noclobbertalimat bash için değil varolan herhangi dosyanın üzerine, >|sözdizimi, bu sınırlama geçmesine izin:
$ testfile=$(mktemp /tmp/testNoClobberDate-XXXXXX)
$ date > $testfile ; cat $testfile
Mon Jan 7 13:18:15 CET 2013
$ date > $testfile ; cat $testfile
Mon Jan 7 13:18:19 CET 2013
$ date > $testfile ; cat $testfile
Mon Jan 7 13:18:21 CET 2013
Her seferinde dosyanın üzerine yazılır:
$ set -o noclobber
$ date > $testfile ; cat $testfile
bash: /tmp/testNoClobberDate-WW1xi9: cannot overwrite existing file
Mon Jan 7 13:18:21 CET 2013
$ date > $testfile ; cat $testfile
bash: /tmp/testNoClobberDate-WW1xi9: cannot overwrite existing file
Mon Jan 7 13:18:21 CET 2013
Şununla geç >|:
$ date >| $testfile ; cat $testfile
Mon Jan 7 13:18:58 CET 2013
$ date >| $testfile ; cat $testfile
Mon Jan 7 13:19:01 CET 2013
Bu seçeneğin ayarını kaldırmak ve / veya önceden ayarlanmışsa sormak.
$ set -o | grep noclobber
noclobber on
$ set +o noclobber
$ set -o | grep noclobber
noclobber off
$ date > $testfile ; cat $testfile
Mon Jan 7 13:24:27 CET 2013
$ rm $testfile
4 - Son hile ve daha fazlası ...
Belirli bir komuttan her iki çıktıyı yeniden yönlendirmek için doğru bir sözdiziminin olabileceğini görüyoruz:
$ ls -ld /tmp /tnt >/dev/null 2>&1
bu özel durum için bir kısayol sözdizimi vardır: &>... veya>&
$ ls -ld /tmp /tnt &>/dev/null
$ ls -ld /tmp /tnt >&/dev/null
Not: Varsa 2>&1, 1>&2doğru bir sözdizimidir:
$ ls -ld /tmp /tnt 2>/dev/null 1>&2
4b- Şimdi düşünmenize izin vereceğim:
$ ls -ld /tmp /tnt 2>&1 1>&2 | sed -e s/^/++/
++/bin/ls: cannot access /tnt: No such file or directory
++drwxrwxrwt 193 root root 196608 Feb 9 11:08 /tmp/
$ ls -ld /tmp /tnt 1>&2 2>&1 | sed -e s/^/++/
/bin/ls: cannot access /tnt: No such file or directory
drwxrwxrwt 193 root root 196608 Feb 9 11:08 /tmp/
4c- Daha fazla bilgi edinmek istiyorsanız
İnce kılavuzu okuyarak okuyabilirsiniz:
man -Len -Pless\ +/^REDIRECTION bash
içinde darbe konsol ;-)