该题考察Linux下的输入/输出重定向。在Linux中,每个打开的文件被赋予一个文件描述符(file descriptor),包括标准输入(stdin),标准输出(stdout)和标准错误输出(stderr),由0,1,2分别描述。
A选项,command &> file 表示将标准输出(stdout)和标准错误输出(stderr)重定向至指定的文件file中。
B选项,语法错误。正确的语法是M >& N,M和N都是文件描述符,M在不指定的情况下默认是文件描述符1。
C选项,command > file 2>&1,是由两部分组成。首先command>file表示将标准输出(stdout)重定向到文件file中。接下来的2>&1表示将标准错误输出(stderr)输出到文件描述符1指定的位置,即标准输出(stdout)的位置,由于标准输出已经冲定向到文件file中,所以标准错误输出也会重定向到文件file中。
D选项,command 2> file 1> file,也可看成是由两部分组成。首先command 2> file,表示将标准错误输出(stderr)重定向到文件file中;1> file,表示将标准输出(stdout)重定向到文件file中。 最终的file中不会包含标准错误输出(stderr)的信息,因为会被之后的标准输出(stdout)覆盖。
&> 等如 2>&1 , > 等如 1> ,那是缩写,
1 是 STDOUT, 2 是 STDERR, 2>&1 就是 STDOUT 和 STDERR
在Linux中,每个打开的文件被赋予一个文件描述符(file descriptor),包括标准输入(stdin),标准输出(stdout)和标准错误输出(stderr),由0,1,2分别描述。
A选项,command &> file 表示将标准输出(stdout)和标准错误输出(stderr)重定向至指定的文件file中。
B选项,语法错误。正确的语法是M >& N,M和N都是文件描述符,M在不指定的情况下默认是文件描述符1。
C选项,command > file 2>&1,是由两部分组成。首先command>file表示将标准输出(stdout)重定向到文件file中。接下来的2>&1表示将标准错误输出(stderr)输出到文件描述符1指定的位置,即标准输出(stdout)的位置,由于标准输出已经冲定向到文件file中,所以标准错误输出也会重定向到文件file中。
D选项,command 2> file 1> file,也可看成是由两部分组成。首先command 2> file,表示将标准错误输出(stderr)重定向到文件file中;1> file,表示将标准输出(stdout)重定向到文件file中。 最终的file中不会包含标准错误输出(stderr)的信息,因为会被之后的标准输出(stdout)覆盖。
在bash中,将脚本的标准输出(stdout)和标准错误输出(stderr)同时重定向到同一个文件时,有几种正确的语法。以下是针对每个选项的分析:
选项A: bash demo.sh &>demo.log
这是bash的简写语法,&> 直接将stdout和stderr都重定向到文件demo.log。此语法简洁且正确。
选项B: bash demo.sh >& demo.log
在bash中,>& file 等同于 &>file,用于将stdout和stderr都重定向到文件demo.log。虽然此语法源自csh,但bash完全支持,因此正确。
选项C: bash demo.sh >demo.log 2>&1
这是经典的重定向方法:
>demo.log 先将stdout重定向到demo.log。
2>&1 再将stderr重定向到stdout的当前位置(即demo.log)。
此方法确保stdout和stderr都写入同一个文件,且输出顺序正确,因此正确。
选项D: bash demo.sh 2>demo.log 1>demo.log
此命令分别将stderr(2>demo.log)和stdout(1>demo.log)重定向到同一个文件demo.log。然而,这会导致文件被打开两次,可能引发问题:
stdout和stderr作为独立的文件描述符写入,可能导致输出交错(顺序混乱)或覆盖(尤其在大量输出时)。
如果文件不存在,会创建两次,可能造成竞争条件。
因此,此方法不可靠,不推荐使用,不正确。
demo.sh>&demo.log 亲测可以,靠的很进也可以标准输入: