Tar

為什麼當 tar 從腳本執行時我得到“找不到命令”,(它執行時沒有從終端給我這樣的輸出)?

  • January 13, 2022

以下腳本完成歸檔工作/home/jerzy/testdir/

#!/usr/bin/bash

XZ_OPT=-9 tar -cJf /home/jerzy/testdir.tar.xz -C /home/jerzy testdir && \   

echo "testdir/ already archived" 

儘管如此,它還是給了我以下輸出:

line 3:  : command not found
testdir/ already archived

XZ_OPT=-9 tar -cJf /home/jerzy/testdir.tar.xz -C /home/jerzy testdir從終端執行時,它會在不吐出的情況下完成其工作command not found。為什麼當我得到的腳本執行同一行時command not found?指定完整路徑,即/usr/bin/tar不能解決問題。

我的環境:Ubuntu Desktop 20.04LTS,which tar返回/usr/bin/tar.

tar命令之後,你有&&一個續行。或者更確切地說,如果\.

由於\在行尾的後面有一個或多個空格,shell 會將其解釋為名稱為單個空格的命令。找不到這個命令。

測試執行名稱為單個空格的命令:

$ ' '
bash:  : command not found
$ \  # an escaped space
bash:  : command not found

bash:(未找到的命令名稱是和之間的兩個空格中的第二個: command not found。)

解決方案是刪除之後的空格,\以便反斜杠是該行的最後一個字元(轉義換行符)。

或者,\完全刪除。腳本中此時無需續行。

#!/bin/sh

XZ_OPT=-9 tar -cJ -f ~jerzy/testdir.tar.xz -C ~jerzy testdir &&
echo '"testdir" archived'

我在/bin/sh這裡使用,而不是bash腳本中沒有任何內容需要bash. 我還冒昧地使用波浪號語法來訪問使用者的主目錄jerzy。這樣,您的腳本甚至可以在主目錄位於其他位置的系統上執行,例如 macOS。如果您打算引用目前使用者的主目錄,我會使用它"$HOME"


有幾種方法可以使echo命令取決於命令的成功或失敗更加明顯tar。例如,您可以縮進echo命令:

XZ_OPT=-9 tar -cJ -f ~jerzy/testdir.tar.xz -C ~jerzy testdir &&
   echo '"testdir" archived'

…或者,如果它不會導致太長的行,則不要換行:

XZ_OPT=-9 tar -cJ -f ~jerzy/testdir.tar.xz -C ~jerzy testdir && echo '"testdir" archived'

你甚至可以把它變成一個成熟的if聲明:

if XZ_OPT=-9 tar -cJ -f ~jerzy/testdir.tar.xz -C ~jerzy testdir
then
   echo '"testdir" archived'
else
   exit
fi

引用自:https://unix.stackexchange.com/questions/686100