簡體   English   中英

在shell的一行中運行多個命令

[英]Running multiple commands in one line in shell

說我有一個文件/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

這是正確的語法嗎?

您正在使用| (管道)將命令的輸出定向到另一個命令。 您正在尋找的是&&運算符,只有前一個命令成功執行才能執行下一個命令:

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因錯誤而失敗。

為什么不先將cp移至位置1,然后將mv移至位置2。這需要“刪除”原始文件。

不,這不是正確的語法。 | 用於“管道”一個程序的輸出,並將其轉換為下一個程序的輸入。 你想要的是; ,它分隔多個命令。

cp file1 file2 ; cp file1 file3 ; rm file1

如果您要求單個命令必須在下一個命令啟動之前成功,那么您可以使用&&代替:

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

這樣,如果任何一個cp命令失敗,則rm將不會運行。

注意cp AB; rm A cp AB; rm A就是mv AB 它也將更快,因為您不必實際復制字節(假設目標位於同一文件系統上),只需重命名文件即可。 所以你想要cp AB; mv AC cp AB; mv AC

另一個選項是在每個命令的末尾鍵入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 + EnterEsc + Enter代替Ctrl + V Ctrl + J

嘗試這個..

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

使用管道對我來說很奇怪。 無論如何,您應該使用邏輯and Bash運算符:

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

如果cp命令失敗,則不會執行rm

或者,您可以使用for循環和cmp制作更詳細的命令行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM