Bir komutun sonundaki "-" işareti ne anlama geliyor?


78

Aşağıdaki komut verildi:

gzip -dc /cdrom/cdrom0/file.tar.gz | tar xvf 

-Komutun sonunda ne anlama geliyor? Bir çeşit yer tutucu mu?


3
Bahsetmek için küçük bir detay: -Komutun sonunda olması gerekmez. Örneğin: ls -l | diff - /old_ls_output.txt.
Manatwork

Yanıtlar:


82

Bu durumda, 'standart giriş' anlamına gelir. tarBir dosya argümanı gerektiğinde ve bunun yerine stdin kullanmanız gerektiğinde bazı yazılımlar (örn. ) Tarafından kullanılır . Bu bir kabuk yapısı değildir ve kullandığınız programa bağlıdır. Şüpheniz varsa man sayfasını kontrol edin!

Bu örnekte, standart giriş -fseçeneğin argümanıdır . -Desteklenmeyen durumlarda , tar xvf /proc/self/fd/0veya benzeri bir şey kullanmaktan tar xvf /dev/stdinkaçınabilirsiniz (ikincisi, çeşitli birliklerde yaygın olarak desteklenir).

Evrensel olarak 'standart girdi' demek için buna güvenmeyin. Kabuk tarafından yorumlanmadığından, her program istediği gibi uğraşmakta özgürdür. Bazı durumlarda, standart çıktı ya da tamamen farklı bir şey var: üzerinde su'giriş kabuğu başlat' anlamına geliyor. Diğer durumlarda, hiç yorumlanmadı. Kas hafızası, adında epeyce dosya oluşturmamı sağladı, -çünkü programın bazı versiyonları kısa bir satırı anlamadı.


4
Ayrıca STDOUT, bağlama bağlı olarak da anlamına gelebilir .
bahamat

3
Ve yorumlamak için bireysel programlara kalmış olduğu gibi hemen hemen her şey.
Alexios

5
/dev/stdinveya /dev/stdoutgerçekten bir giriş / çıkış akışı istiyorsanız, kullanılabilir. Bir akış olduğuna dikkat edin, bir dosyada arama yapmak isteyen programlar -(örn. Ffmpeg) ile olduğu gibi onunla düzgün çalışmayabilir
Lekensteyn

3
Bu durumda bash, kısa çizgi , kabuk tarafından yorumlanır. Bkz Gelişmiş Bash-Komut Kılavuzu - Bölüm 3. Özel Karakterler ardından "Stdin veya Stdout'a / dan yönlendirme" metin [tire] veya arayın. Kullanarak bashbir dosya adı bekliyor çoğu yerde kısa çizgi kullanabilirsiniz. Bu açık bir tamamlayıcı <| > IMHO
bsd

4
Bunun böyle olduğuna ikna olmadım. İlk önce, catkolları -(manpage kontrol edin). Bir kabuk yerleşik sürümü catolabilir veya olmayabilir, ancak bu kesinlikle kabuğun tamamı değildir. Ayrıca, eğer kabuk işlenirse -yankı diyebilir -ve başka bir şeye genişleyecektir. Bunun yerine, sadece bir çizgi ekoları ( /dev/stdinveya değil /proc/self/fd/0). Ve echo test > -sadece denilen bir dosya yaratır -, bu yüzden açıkça orada da işlemez. Oh, ve listelediğiniz sayfa kabuk tarafından işlendiğini söylemedi , onu kullanabileceğinizi catve diffher ikisinin de çizgileri açıkça anlayabildiğini söylüyor .
Alexios

13

Bu durumda, -Linux kullandığınızı varsayarsak, aslında oldukça işe yaramaz:

GNU tar (Linux'taki sürüm), girişini standart girdiden varsayılan olarak kabul eder. Eğer yoksa değil bu davranışı istemek ve bir komut satırı argümanı olarak dosya adını geçmek istiyorum, o zaman bayrağını belirtmeniz gerekir f:

tar xf filename

Yani bu aynı

tar x < filename

Veya, giriş örneğinizdeki gibi gösteriliyorsa:

gzip -dc filename | tar x

fBayrağı burada belirtmek anlamlı değildir , ancak belirtildiğinden, -standart girişten okumak istediğimizi belirtmek için dosya adının verilmesi gerekir (diğer cevaba bakınız). Yani, tekrarlamak için, bu gereksiz ve biraz garip.

Ayrıca, yukarıdaki satır sadeleştirilebilir çünkü GNU tar'a bayrak gzipbelirtilerek girdiyi kendisinden geçirmesi söylenebilir z:

tar xfz filename

- gzipAçıkça aramana gerek yok .


1
Not: Her tarbirinin zseçeneği yoktur.
liori

2
Linux dışındaki çoğu işletim tarsistemi, tarihsel nedenlerden dolayı ilk teyp sürücüsüne geçmiştir.
Gilles

1
@ Gilles ve BSD ve OS X,…. Ama merak ediyorum: birkaç eski mainframe dışında başka hangi sistemleri hala (hatta yok mainframe başka hangi sistemler böyle bir sürümünü kullanmak zorunda bir teyp sürücü)?
Konrad Rudolph

1
@KonradRudolph Üç büyük BSD'nin tümü varsayılan olarak bir teyp sürücüsüne ( /dev/sa0FreeBSD 9.0'da, /dev/rst0NetBSD 6.0 ve OpenBSD 5.1'de). AIX 7.1 varsayılan olarak /dev/rmt0. MINIX3 varsayılan olarak /dev/sa0. (Her durumda en son işletim sistemi sürümünü kontrol ettim, bunlar “eski ana bilgisayarlar” değildir.) Solaris, /etcvarsayılan olarak bir teyp sürücüsüne varsayılan olduğunu düşündüğüm bir dosya aracılığıyla yapılandırılabilir . GNU katran, Schilling katran, OSX ve BusyBox varsayılan olarak stdin / stdout'a ayarlanır.
Gilles

1
@Gilles - Belirgin nedenlerden dolayı tarvarsayılan olarak ikinci teyp sürücüsüne derledim . :)
David Harkness
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.