watchコマンドの別名が停止しましたか?

watchコマンドの別名が停止しましたか?

エイリアスがウォッチステートメントで拡張されるように、このエイリアスを作成しました。

> alias w='watch -x bash -i -c'
> alias k=kubectl

私はそれを実行します:

> w 'k get pods; echo; k get svc'

2秒後に私は次を見る:

[2]+  Stopped                 watch -x bash -i -c 'k get pods; echo; k get svc'

watchコマンドが停止しました。

watchコマンドが停止するのはなぜですか?

バージョン:Bash 5.1.16。 Ubuntu 22.04。

答え1

コマンドには2つの問題があります。

  1. bash -i対話型シェルセッションを開始し、watch対話型コマンドと一緒に使用することはできません。これが「停止しました」というメッセージが表示される理由です。シェルでこのコマンドを実行すると、zshこのコマンドも表示されますsuspended (tty output)
  2. エイリアスは子プロセスによって継承されません。つまり、kシェルのエイリアスは、「監視」しているシェルには表示されません。

代わりに:

watch -x bash -c 'kubectl get pods; echo; kubectl get svc'

または、

watch 'kubectl get pods; echo; kubectl get svc'

bashを使用して対話型シェルを実行せず、watch未定義のエイリアスを使用しようとしません。

エイリアスを拡張するために対話型シェルを実行している場合は、適切bashexpand_aliasesシェルオプションを使用してください。

watch -x bash -O expand_aliases -c $'alias k=kubectl\nk get pods; echo; k get svc'

インラインスクリプトでエイリアスを定義し、エイリアス定義の後にリテラル改行を挿入する必要があります(エイリアスが定義されているのと同じ行ではエイリアスを使用できません)。私はコマンド文字列をC文字列()で作成し、改行文字を追加して$'...'これを達成しました\n。次のようにコマンド文字列にリテラル改行を挿入することもできます。

watch -x bash -O expand_aliases -c 'alias k=kubectl
k get pods; echo; k get svc'

関連情報