スクリプトを実行すると、次のメッセージが表示されます。厳密に言えば、その後も実行が続くので、エラーではありません。
myScript -s test -u test2
pk_copylogs[2]: hist: :: not found
しかし、なぜこのメッセージが表示されるのか知っていますか?
答え1
このhist
コマンドはkornシェル(ksh93)組み込みコマンドで、bashでは使用できません。
あなたのスクリプトはkshではなくbashで実行されているようです。
ksh$ command -V hist
hist is a shell builtin
bash$ command -V hist
bash: command: hist: not found
以下を試してください。
$ ksh myScript -s test -u test2
または:
$ SHELL=ksh ksh myScript -s test -u test2
ただし、hist
このコマンドは通常対話型モードでのみ使用され、スクリプトでは使用したくありません。直接呼び出されることはほとんどなく、通常は次のエイリアスの1つとして呼び出されます。
$ alias | grep hist
fc=hist
history='hist -l'
r='hist -s'
fc
、history
で1つを探しますr
。
答え2
コードにはmyScript
名前の異なる外部スクリプトがありますpk_copylogs
。 pk_copylogsの2行目には、hist
変数に含まれているディレクトリの1つなど、どこからでもアクセスできるコマンドがあるとします$PATH
。
この問題の最も可能性の高い原因は、私が使用したほとんどのシェルでショートカットを構成する必要はありませんでしたが、私よりも先の人がショートカットを構成し、便宜上、コマンドがコマンドhist
としてエイリアスされているためです。history
しかし、シェルスクリプトを起動すると、エイリアスは消えます。もちろん、状況はまったく異なる可能性がありますが、参照している2つのスクリプト(myScriptやpk_copylogsなど)の実際のコードを見なければ、主張するのは難しいです。
答え3
fc_copylogs
スクリプトの2行目を見てください。これはエラーメッセージをトリガーする行です。
以下は、受信したメッセージと同じメッセージを再現する1つの方法です。
$ cd /tmp
$ cat > pk_copylogs <<%
#!/bin/ksh
fc $1
%
$ chmod +x /tmp/pk_copylogs
$ PATH=$PATH:/tmp pk_copylogs ::
pk_copylogs[2]: hist: :: not found
もちろん、これはあなたの状況とまったく同じではないかもしれませんが、確かに非常に近いです。
pk_copylogs の 2 行目には、次の行だけを含めることができます。
hist ::
これは、まったく同じエラーメッセージまたはそのエラーメッセージに展開されるエラーメッセージを生成します。
どこを探すべきかわからない場合は、次のコマンドを実行して問題のあるスクリプトを見つけることができます。
find / -name pk_copylogs -print
それでは最初の行から見てください
head /path/to/pk_copylogs