スクリプトで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

ベストアンサー1

tarコマンドの後には&&連続行があります。それともむしろ続くでしょう。もしその後にスペースはありません\

行の末尾には1つ以上のスペースがあるため、\シェルはそれを単一のスペースとして指定されたコマンドとして解釈します。コマンドが見つかりません。

単一のスペースで指定されたコマンドの実行をテストします。

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

(見つからないコマンド名は、bash:との間の2つのスペースの2番目です: command not found。)

解決策は、\バックスラッシュが行の最後の文字になるように末尾のスペースを削除することです(改行文字をエスケープします)。

または完全に削除してください\。現在、スクリプトには行の連続は必要ありません。

#!/bin/sh

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

スクリプトに必要なものがないため、/bin/shここで代わりに使用しています。また、ユーザーのホームディレクトリにアクセスするためにチルダ構文を自由に使用できました。これにより、macOSと同様に、ホームディレクトリが別の場所にあるシステムでもスクリプトを実行できます。ホームディレクトリを参照したい場合bashbashjerzy現在のユーザーなら、私はそれを"$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

おすすめ記事