Given the following command:
gzip -dc /cdrom/cdrom0/file.tar.gz | tar xvf –
What does the
- at the end of the command mean? Is it some kind of placeholder?
Stack Exchange network consists of 181 Q&A communities including Stack Overflow, the largest, most trusted online community for developers to learn, share their knowledge, and build their careers.Visit Stack Exchange
Unix & Linux Stack Exchange is a question and answer site for users of Linux, FreeBSD and other Un*x-like operating systems. It only takes a minute to sign up.Sign up to join this community
In this case, it means ‘standard input’. It's used by some software (e.g.
tar) when a file argument is required and you need to use stdin instead. It's not a shell construct and it depends on the program you're using. Check the manpage if in doubt!
In this instance, standard input is the argument to the
-f option. In cases where
- isn't supported, you can get away with using something like
tar xvf /proc/self/fd/0 or
tar xvf /dev/stdin (the latter is widely supported in various unices).
Don't rely on this to mean ‘standard input’ universally. Since it's not interpreted by the shell, every program is free to deal with it as it pleases. In some cases, it's standard output or something entirely different: on
su it signifies ‘start a login shell’. In other cases, it's not interpreted at all. Muscle memory has made me create quite a few files named
- because some version of some program I was used to didn't understand the dash.
STDOUT, depending on the context.
/dev/stdoutcan be used if you really want an input/output stream. Note that it is a stream, programs that want to seek in a file may not work properly with it as would be the case with
-(e.g. ffmpeg) Jun 28, 2012 at 11:49
bash, the hyphen is interpreted by the shell. See the Advanced Bash-Scripting Guide - Chapter 3. Special Characters, then search for the text [dash] or "redirection from/to stdin or stdout". Using
bashyou can use the hyphen most places expecting a filename. It's an obvious complement to < | > IMHO
-(check the manpage). A shell-builtin version of
catmight or might not, but that's not strictly the entire shell. Also, if the shell handled
-, you could say echo
-and it would expand to something else. Instead, it just echoes a dash (not
echo test > -just creates a file called
-, so it clearly doesn't handle it there either. Oh, and the page you listed doesn't say it's handled by the shell, it says you can use it with
diff, both of which understand dashes explicitly.
In this case, the
- is actually pretty useless, assuming you're running Linux:
GNU tar (the version on Linux) accepts its input from the standard input by default. If you do not want this behaviour, and want to pass the file name as a command line argument, then you need to specify the flag
tar xf filename
So this is the same as
tar x < filename
Or, if the input is gzipped as in your example:
gzip -dc filename | tar x
It isn’t meaningful to specify the
f flag here at all, but because it was specified, the filename needs to be given as
- to indicate that we want to read from standard input (see other answer). So, to repeat, this is redundant and slightly weird.
Furthermore, the above line can be simplified because GNU tar can be told to stream the input through
gzip itself by specifying the
tar xfz filename
– No need to call
tardefaulting to the first tape drive, for historical reasons. Jun 28, 2012 at 23:31
/dev/sa0on FreeBSD 9.0,
/dev/rst0on NetBSD 6.0 and OpenBSD 5.1). AIX 7.1 defaults to
/dev/rmt0. MINIX3 defaults to
/dev/sa0. (I checked the latest OS version in each case, these aren't “old mainframes”.) Solaris is configurable through a file in
/etc, which I think defaults to a tape drive. GNU tar, Schilling tar, OSX and BusyBox default to stdin/stdout. Jun 29, 2012 at 7:46
tarto default to the second tape drive, for obvious reasons. :) Jun 29, 2012 at 9:09
-not needs to be at the end of the command. For example:
ls -l | diff - /old_ls_output.txt.