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
, STDOUT
ve 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
( /tnt
Elbette 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ı STDERR
konsola 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: &9
tanı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
STDOUT
Belirli bir filtreden geçtiği yerde , STDERR
diğerine ve son olarak her iki çıkış da üçüncü bir komut filtresinden geçer.
3 - noclobber
Seçenek ve >|
sözdizimi hakkında bir kelime
Üzerine yazmakla ilgili :
İken set -o noclobber
talimat 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>&2
doğ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 ;-)