说我有一个文件/templates/apple
而且我想要 bash
所以, /templates/apple
将被复制到/templates/used
和/templates/inuse
,而后在此以后,我想删除原始文件。 app
cp
是执行此操做的最佳方法,其次是rm
吗? 或者,还有更好的方法? spa
我想一行完成全部操做,因此我认为它看起来像: 命令行
cp /templates/apple /templates/used | cp /templates/apple /templates/inuse | rm /templates/apple
这是正确的语法吗? code
另外一个选项是在每一个命令的末尾键入Ctrl + V Ctrl + J。 zsh
示例(用Ctrl + V Ctrl + J替换#
): sed
$ echo 1# echo 2# echo 3
输出: file
1 2 3
不管先前的命令是否失败,这将执行命令。 循环
与: echo 1; echo 2; echo 3
echo 1; echo 2; echo 3
语法
若是要中止执行失败的命令,请在每行的末尾添加&&
,最后一行除外。
示例(用Ctrl + V Ctrl + J替换#
):
$ echo 1 &&# failed-command &&# echo 2
输出:
1 failed-command: command not found
在zsh
您也可使用Alt + Enter或Esc + Enter代替Ctrl + V Ctrl + J
为何不先将cp
移至位置1,而后将mv
移至位置2。这须要“删除”原始文件。
不,这不是正确的语法。 |
用于“管道”一个程序的输出,并将其转换为下一个程序的输入。 你想要的是;
,它分隔多个命令。
cp file1 file2 ; cp file1 file3 ; rm file1
若是您要求单个命令必须在下一个命令启动以前成功,那么您可使用&&
代替:
cp file1 file2 && cp file1 file3 && rm file1
这样,若是任何一个cp
命令失败,则rm
将不会运行。
尝试这个..
cp /templates/apple /templates/used && cp /templates/apple /templates/inuse && rm /templates/apple
您正在使用|
(管道)将命令的输出定向到另外一个命令。 您正在寻找的是&&
运算符,只有前一个命令成功执行才能执行下一个命令:
cp /templates/apple /templates/used && cp /templates/apple /templates/inuse && rm /templates/apple
要么
cp /templates/apple /templates/used && mv /templates/apple /templates/inuse
总结一下(非详尽地)bash的命令运算符/分隔符:
|
将一个命令的标准输出( stdout
)用管道stdout
到另外一个命令的标准输入中。 请注意,不管发生什么状况, stderr
仍会进入其默认目的地。 |&
将一个命令的stdout
和stderr
都stderr
到另外一命令的标准输入中。 很是有用,在bash版本4及更高版本中可用。 &&
执行的右手命令&&
仅在上一个成功。 ||
执行||
的右手命令 只有前一个失败。 ;
执行的右手命令;
始终无论上一个命令是成功仍是失败。 除非先前曾调用set -e
,不然这将致使bash
因错误而失败。 使用管道对我来讲很奇怪。 不管如何,您应该使用逻辑and
Bash运算符:
$ cp /templates/apple /templates/used && cp /templates/apple /templates/inuse && rm /templates/apples
若是cp
命令失败,则不会执行rm
。
或者,您可使用for
循环和cmp
制做更详细的命令行。