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

自古美人都是妖i 提交于 2020-02-29 16:29:50

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

  1. 放在两个不同的地方,然后
  2. 删除原件。

因此, /templates/apple将被复制到/templates/used/templates/inuse ,然后在此之后,我想删除原始文件。

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

我想一行完成所有操作,所以我认为它看起来像:

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

这是正确的语法吗?


#1楼

另一个选项是在每个命令的末尾键入Ctrl + V Ctrl + J。

示例(用Ctrl + V Ctrl + J替换# ):

$ echo 1#
echo 2#
echo 3

输出:

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制作更详细的命令行。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!