次のスクリプトはアーカイブ操作を完了します/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と同様に、ホームディレクトリが別の場所にあるシステムでもスクリプトを実行できます。ホームディレクトリを参照したい場合bash
bash
jerzy
現在のユーザーなら、私はそれを"$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