Tar
為什麼當 tar 從腳本執行時我得到“找不到命令”,(它執行時沒有從終端給我這樣的輸出)?
以下腳本完成歸檔工作
/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