エイリアスを含むwatch
コマンドを実行しても、エイリアスは展開されません。実際、次のエイリアスを指定して、一重引用符と二重引用符の両方を試してみました。
# alias ll
alias ll='ls -l --color=tty'
次のコマンドは失敗します
# watch ll
sh: ll: command not found
この場合、コマンドラインの展開は機能しませんか?
エイリアスは、最初の引数として、またはコマンドの末尾にスペースが続く別のエイリアスの後にのみ展開されます。
bash
のhelp alias
から:
VALUEの後にスペースがあると、エイリアスが展開されたときに次のWordのエイリアス置換がチェックされます。
これを行うには、次のことを試してください。
alias watch='watch '
alias ll='ls -l --color=tty'
watch ll
watch
の一部のバージョンはデフォルトで色を取り除きます。一部のバージョンでは、これは--color
または-G
を使用して停止できます。
たぶん、時計が見る前に手動でエイリアスを拡張できるでしょうか?
watch $(alias ll | cut -d\' -f2)
alias ll
の出力は次のようになります。
$ alias ll
alias ll='ls -lAGh'
したがって、カットのデリミタを単一引用符に設定し、2番目のフィールドをカットして、次のようにします。
ls -lAGh
つまり、拡張されたエイリアス。 Thatは、watch
に指定された引数を形成します。
function watcha {
watch $(alias "$@" | cut -d\' -f2)
}
そして、
watcha ll
必要に応じて機能します。これはひどいものであり、あらゆる状況で失敗します。ごめんなさい。
watch
に、エイリアスを展開する新しいインタラクティブシェルを実行させます。
watch -x bash -i -c ll
(-x
は、watch
が独自のsh -c
を使用して特定のコマンドをラップするのを防ぐためのものです。-i
をsh
またはbash
に渡して、 .bashrcを読み取ってエイリアスを定義するインタラクティブなシェルです。-x
を使用すると、watchはexecを使用してコマンドを実行します。
ええ、実際には、これは機能しません。 「ll」の出力を1回表示してから2秒間スリープすると、ジョブはバックグラウンド化され、少し不可解になります。
1]+ Stopped watch -x bash -i -c ll
なぜ停止したのですか?中かっこ[
はどこに行きましたか?くそーこれは素晴らしい答えになるだろうと思ったが、私はそれを機能させることができません。
これを処理するカスタムプログラムが github.com/antonmedv/watch にあります。複数のシェルをサポートしています。もちろん、インストールするのはカスタムソフトウェアなので、通常のコンピューターでは問題ありませんが、接続している可能性のあるランダムなサーバーでは役に立ちません。これは、zshエイリアスと関数を監視できるように実行する方法です。
function watch-zsh() {
WATCH_COMMAND='zsh -ci' /usr/local/bin/watch "$@"
}
ここでの基本的な問題はwatch
の実行中に発生すると考えました。引数は "_sh -c
_"に渡されます。つまり、エイリアスll
がsh(dash Shell's)
環境で定義されていない場合、拡大しません。しかし、私は間違っていて、これはそうではありません、上のクリスの答えは正しいです。