Bu komut nasıl yasaldır? “> Dosya1 <dosya2 kedisi”


61

Varsayalım ki file2, komut

> file1 < file2 cat

içeriğini kopyalayarak gibi görünmektedir file2için file1.

Ancak bu yapıyı anlayamıyorum.

"Hiçbir şeyin" yönlendirilmediğini file1, (içeriğini oluşturduğu veya sildiğini) anlıyorum . Daha sonra içeriği file2yönlendiriliyor file1.

Neden catsonra file2? cat file2İşlenenlerin doğru sırada olup olmadığını nasıl anlar ?


11
Hangi "doğru sıra"? Bir "doğru sipariş" in tanımlandığı bazı kaynak / öğrenme materyallerine bir link verebilir misiniz?
Monica ile Hafiflik Yarışları

7
Bunun gibi sorular sorarken, kabuğu belirtmelisiniz; farklı olanlar, özellikle yönlendirme çevresinde, farklı kenar durumlarına sahiptir.
chrylis

Yanıtlar:


117

Kabuk cat, komut satırındaki komutu çalıştırmadan önce yönlendirmeleri arar.

İki yönlendirme var:

  1. >file1 Bu komutun standart çıktısına gitmesini sağlayacaktır file1.
  2. <file2 Bu komutun standart girişinin gelmesini sağlayacaktır file2.

Bu yönlendirmelerin komut satırında çok garip bir yere yerleştirilmesi önemli değil.

$ cat <file2 >file1

aynıdır

$ <file2 cat >file1

hangisi aynı

$ <file2 >file1 cat

etc.¹

Not catBu durumlarda tüm yardımcı yürütülür herhangi bir komut satırı değişkenleri olmadan . Yönlendirmeler catkomuta işlenen değildir, komutun içine ve dışına yeniden yönlendirme ayarlamak için kabuğa talimatlardır (standart giriş ve çıkışını dosyalara bağlar). Kabuk , komutu çağırmadan önce yönlendirmeleri ayarlar .

Arasındaki fark cat fileve cat <file(, eğer olacak ya da <file cat) olup, ilk durumda, bir catkendini okuma için, komut hattı üzerinde bir işlemci olarak verilir dosyayı açıyor yardımcı olurken, ikinci durumda, kabuk olacak dosyayı açın ve catgiriş akışını ²'ye bağlayın. İkinci durumda, catdosya işleneni verilmediğini fark edecek ve otomatik olarak standart girişinden okumaya geçecektir. Bu, cattüm yardımcı programların yaptığı bir özellik değil, diğer bazı yardımcı programların bir özelliğidir .

catEğer operand verilirse standart girdilerinden de okuyacaktır -. Yine, bu sadece catve diğer bazı yardımcı programlara (yani kabuğun yaptığı hiçbir şeye ) özeldir . Kullanmak için catadı geçerli dizinde bir dosya üzerinde olduğu - gibi, dosya adına bir yolunu ekleyin ./-.

Circumstances Yönlendirmelerin sırası bazı durumlarda hala önemlidir; İle cat <file2 >file1örneğin, file1eğer fazlalıklar atılacak değil file2erişilemez (yönlendirmeler soldan sağa çözümlenir). catBununla birlikte , kelimenin göreceli yerleşimi isteğe bağlıdır ve bunu etkilemeyecektir.

² Ayrıca “ kedi mevcut olmayan bir dosyayı açarken farklı hatalar veriyor ” sorusuna bakın .


Kabuğun, komut satırında komutu bile çalıştırmadan önce yönlendirmeleri oluşturması, bunun gibi şeylerin neden başarısız olduğunu ve boş bir çıktı dosyası oluşturduğunuzu gösterir:

$ sort file >file

Burada kabuk, standart çıktısını fileçalıştırmadan sort fileve dosyaya bağlamadan önce dosyayı kesecek (boş) sort. Yardımcı sortprogram daha sonra açılacak fileve içeriğini sıralayacaktır (bu hiçbir şey değildir). Sonuç (hiçbir şey), standart çıkış akışından 'ye geçirilir file.

Bu özel durumda çözüm (bir dosyayı "yerinde" sıralamak için)

$ sort -o file file

veya

$ sort file >file.sorted && mv file.sorted file

Bu çıktı dosyası adını belirtmek için dosyayı sortkullanırken ne kadar az -omı?


Yönlendirmelerin komut satırındaki yardımcı programın asıl adından önce gelebileceği ifadesini yedeklemek için:

Bir "basit komut", isteğe bağlı olarak bir kontrol operatörü tarafından sonlandırılan kelimeler ve yönlendirmelerin takip ettiği herhangi bir sırada isteğe bağlı değişken atama ve yönlendirmelerinin bir dizisidir. [ref: POSIX Kabuk Komut Dili 2.9.1 Basit Komutlar]

Ve ayrıca yönlendirme ile ilgili olarak yardımcı programın işleçlerinin bir parçası olmamaları:

İsteğe bağlı numara, yönlendirme operatörü ve kelime, yürütülecek komuta verilen (varsa) argümanlarda görünmeyecektir. [ref: POSIX Kabuk Komut Dili 2.7 Yönlendirme]


14
@Steve Yönlendirmelerin etrafını dolaşma özgürlüğü, bazı komutları daha net hale getirmek için kullanılabilir; başlangıçta giriş yönlendirmeli bir boru hattı gibi <in foo | bar >out, her şeyi mantıklı bir sıraya sokar. echo >&2 Something bad happenedKabuk komut dosyalarından hata çıktısı için de düşkünüm . Ama >out <in catsadece şaşkınlık

2
sort file >fileDoğru bir şekilde nasıl başarılabilir?
seth10

11
@setht ile sort -o file file.
Kusalananda

6
Mükemmel cevap. Siparişin önemli olduğunu unutmayın. açılamazsa kesilmekten kaçınacaklarından < file1 > file2 catdaha iyi > file2 < file1 catolurdu . file2file1
Stéphane Chazelas

3
Dikkat edilmesi gerekenler: POSIX’e HTML parçalarıyla bağlanırken , parçaların tam olarak aynı revizyona göre değiştirildiği bilinen parçaların tam olarak belirtilmesi ( pubs.opengroup.org/onlinepubs/9699919799.2016edition gibi ) belirtilmesi daha iyidir. (benimki de dahil olmak üzere, bu sitede yer alan cevaplardaki bağlantıların çoğu, 2016 baskısı yayınlandıktan sonra yanlış yerlere işaret ettiği için artık yanlış).
Stéphane Chazelas
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.