通过命令 shell,我们可以重定向三个标准文件流,以便我们可以从文件或其他命令而不是从键盘获取输入,并且我们可以将输出和错误写入文件或将它们作为后续命令的输入发送。
那么为什么我们不能将输入提供给其他文件
~# /root/Documents/text1.txt > /root/Documents/text2.txt
答案1
您无法使用file1 > file2
来复制file1
的内容,file2
因为那里没有命令。您必须发出一些命令。
- 重定向适用于 (1) 您运行的命令或 (2) 整个 shell(如果应用于
exec
内置命令)。但它们通过更改执行输入输出操作(即读取或写入文件或设备)的操作的源或目标来工作。您必须实际执行一些操作。 file1 > file2
在某些情况下是有效的命令,但它不会复制file1
到file2
。相反,l0b0 说,它试图跑步file1
作为程序或脚本,并且——无论是否成功——发送标准输出以免陷入file1
。file2
(如果file2
是常规文件,则会被覆盖。)很容易让人认为类似的东西
<file1 >file2
会起作用。但事实并非如此:当你停止命令时,不会执行任何操作。file1
用作输入并file2
用作输出……但因为什么都没做,输出为空,唯一的效果是(a)file2
如果它不存在则创建,或(b)file2
如果它存在则清空:ek@Ilex:~$ echo foobar > file1 ek@Ilex:~$ echo quux > file2 ek@Ilex:~$ cat file1 foobar ek@Ilex:~$ cat file2 quux ek@Ilex:~$ <file1 >file2 ek@Ilex:~$ cat file2 ek@Ilex:~$ file file1 file2 file1: ASCII text file2: empty
你可能只是想逃跑cp file1 file2
。
假设这file2
是一个常规文件(或者不存在,但你希望它在命令运行后作为常规文件存在),你应该简单地使用cp
命令。
作为西尔万·皮诺 说cat file1 > file2
,您也可以使用。但是,cp
当写入已存在的文件时,该命令表现良好:它用源覆盖目标,但保留目标的原始权限掩码(因此即使在人们直觉认为cat file1 > file2
需要的情况下也是很好的):
ek@Ilex:~$ echo glockenspiel > file1
ek@Ilex:~$ echo flugelhorn > file2
ek@Ilex:~$ cat file1
glockenspiel
ek@Ilex:~$ cat file2
flugelhorn
ek@Ilex:~$ chmod +x file2
ek@Ilex:~$ ls -l file1 file2
-rw-rw-r-- 1 ek ek 13 Sep 16 03:28 file1
-rwxrwxr-x 1 ek ek 11 Sep 16 03:28 file2
ek@Ilex:~$ cp file1 file2
ek@Ilex:~$ cat file2
glockenspiel
ek@Ilex:~$ ls -l file1 file2
-rw-rw-r-- 1 ek ek 13 Sep 16 03:28 file1
-rwxrwxr-x 1 ek ek 13 Sep 16 03:28 file2
到附加,您可能确实想要一个(不同类型的)重定向。
命令cp
和重定向>
都会覆写常规文件的内容(如果存在)。但>>
重定向会附加。
file1
因此,如果您想将的内容附加到,file2
而不是file2
用的内容覆盖file1
,则可以使用>>
(不是 >
)是一个不错的选择:
ek@Ilex:~$ echo 'Violets are blue.' > file1
ek@Ilex:~$ echo 'Roses are red.' > file2
ek@Ilex:~$ cat file1
Violets are blue.
ek@Ilex:~$ cat file2
Roses are red.
ek@Ilex:~$ cat file1 >> file2
ek@Ilex:~$ cat file2
Roses are red.
Violets are blue.
答案2
您可以使用以下命令重定向 text1.txt 的内容cat
:
~# cat /root/Documents/text1.txt > /root/Documents/text2.txt
笔记:您还可以使用cat
它来创建新的二进制文件,例如:
~# cat mypic.jpg > my_new_pic.jpg
答案3
扩展@SylvainPineau 的回答,你不能这样做的原因/root/Documents/text1.txt > /root/Documents/text2.txt
是,重定向操作符和它后面的文件分开的东西必须是命令。当你执行时,/root/Documents/text1.txt > /root/Documents/text2.txt
你正在告诉 shell执行 /root/Documents/text1.txt
,由于文本文件不应设置执行标志,因此它可能不会运行,并将标准输出保存到/root/Documents/text2.txt
。由于该“命令”的标准输出为空,因此目标文件将为空。
答案4
正如其他人已经指出的那样,您缺少一个命令。以下是一些有趣的组合:
cat <file1.txt >file2.txt
tail <file1.txt >file2.txt
head <file1.txt >file2.txt
wc -l <file1.txt >file2.txt
base64 <file1.txt >file2.txt
base64 -D <file1.txt >file2.txt
gzip -c <file1.txt >file2.txt
gunzip -c <file1.txt >file2.txt
管道/重定向的精神表明需要一个命令(例如复制、提取、计数、编码/解码、压缩/解压缩)来指定将输入转换file1.txt
为输出的操作file2.txt
。