Kshスクリプト警告[閉じる]

Kshスクリプト警告[閉じる]

スクリプトを実行すると、次のメッセージが表示されます。厳密に言えば、その後も実行が続くので、エラーではありません。

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'        

fchistoryで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

関連情報