在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製做更詳細的命令行。

相關文章
相關標籤/搜索