說我有一個文件/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
製做更詳細的命令行。