在shell的一行中运行多个命令

说我有一个文件/templates/apple而且我想要 bash

  1. 放在两个不一样的地方,而后
  2. 删除原件。

所以, /templates/apple将被复制到/templates/used/templates/inuse ,而后在此以后,我想删除原始文件。 app

cp是执行此操做的最佳方法,其次是rm吗? 或者,还有更好的方法? spa

我想一行完成全部操做,因此我认为它看起来像: 命令行

cp /templates/apple /templates/used | cp /templates/apple /templates/inuse | rm /templates/apple

这是正确的语法吗? code


#1楼

另外一个选项是在每一个命令的末尾键入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


#2楼

为何不先将cp移至位置1,而后将mv移至位置2。这须要“删除”原始文件。

不,这不是正确的语法。 | 用于“管道”一个程序的输出,并将其转换为下一个程序的输入。 你想要的是; ,它分隔多个命令。

cp file1 file2 ; cp file1 file3 ; rm file1

若是您要求单个命令必须在下一个命令启动以前成功,那么您可使用&&代替:

cp file1 file2 && cp file1 file3 && rm file1

这样,若是任何一个cp命令失败,则rm将不会运行。


#3楼

尝试这个..

cp /templates/apple /templates/used && cp /templates/apple /templates/inuse && rm /templates/apple


#4楼

您正在使用| (管道)将命令的输出定向到另外一个命令。 您正在寻找的是&&运算符,只有前一个命令成功执行才能执行下一个命令:

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仍会进入其默认目的地。
  • |&将一个命令的stdoutstderrstderr到另外一命令的标准输入中。 很是有用,在bash版本4及更高版本中可用。
  • &&执行的右手命令&&仅在上一个成功。
  • || 执行||的右手命令 只有前一个失败。
  • ; 执行的右手命令; 始终无论上一个命令是成功仍是失败。 除非先前曾调用set -e ,不然这将致使bash因错误而失败。

#5楼

使用管道对我来讲很奇怪。 不管如何,您应该使用逻辑and Bash运算符:

$ cp /templates/apple /templates/used && cp /templates/apple /templates/inuse && rm /templates/apples

若是cp命令失败,则不会执行rm

或者,您可使用for循环和cmp制做更详细的命令行。

相关文章
相关标签/搜索