web-dev-qa-db-ja.com

ウォッチコマンドエイリアス展開

エイリアスを含むwatchコマンドを実行しても、エイリアスは展開されません。実際、次のエイリアスを指定して、一重引用符と二重引用符の両方を試してみました。

# alias ll
alias ll='ls -l --color=tty'

次のコマンドは失敗します

# watch ll
sh: ll: command not found

この場合、コマンドラインの展開は機能しませんか?

74
ztank1013

エイリアスは、最初の引数として、またはコマンドの末尾にスペースが続く別のエイリアスの後にのみ展開されます。

bashhelp aliasから:

VALUEの後にスペースがあると、エイリアスが展開されたときに次のWordのエイリアス置換がチェックされます。

これを行うには、次のことを試してください。

alias watch='watch '
alias ll='ls -l --color=tty'
watch ll

watchの一部のバージョンはデフォルトで色を取り除きます。一部のバージョンでは、これは--colorまたは-Gを使用して停止できます。

113
Chris Down

たぶん、時計が見る前に手動でエイリアスを拡張できるでしょうか?

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

必要に応じて機能します。これはひどいものであり、あらゆる状況で失敗します。ごめんなさい。

3

watchに、エイリアスを展開する新しいインタラクティブシェルを実行させます。

watch -x bash -i -c ll

-xは、watchが独自のsh -cを使用して特定のコマンドをラップするのを防ぐためのものです。-ishまたはbashに渡して、 .bashrcを読み取ってエイリアスを定義するインタラクティブなシェルです。-xを使用すると、watchはexecを使用してコマンドを実行します。

ええ、実際には、これは機能しません。 「ll」の出力を1回表示してから2秒間スリープすると、ジョブはバックグラウンド化され、少し不可解になります。

1]+  Stopped                 watch -x bash -i -c ll

なぜ停止したのですか?中かっこ[はどこに行きましたか?くそーこれは素晴らしい答えになるだろうと思ったが、私はそれを機能させることができません。

0

これを処理するカスタムプログラムが github.com/antonmedv/watch にあります。複数のシェルをサポートしています。もちろん、インストールするのはカスタムソフトウェアなので、通常のコンピューターでは問題ありませんが、接続している可能性のあるランダムなサーバーでは役に立ちません。これは、zshエイリアスと関数を監視できるように実行する方法です。

function watch-zsh() {
  WATCH_COMMAND='zsh -ci' /usr/local/bin/watch "$@"
}
0
Peter Lyons

ここでの基本的な問題はwatchの実行中に発生すると考えました。引数は "_sh -c_"に渡されます。つまり、エイリアスllsh(dash Shell's)環境で定義されていない場合、拡大しません。しかし、私は間違っていて、これはそうではありません、上のクリスの答えは正しいです。

0
Sachin Divekar