ユーザーが実行したいコマンドを実行する前に別のコマンドを実行します


9

lsツールの元の動作を次のように変更したいとします。

$ ls
Hello World
file1 file2 ...

これどうやってするの?

実行しているときls、私は別のコマンドレットの発言権を実行したいと思いますecho "Hello World!"

私が目にする簡単な解決策は、エイリアスを使用することです:

alias orig_ls="ls"
alias ls='echo "Hello World!"'

ただし、実行orig_lsすると出力されるため、これは実際のソリューションではありません"Hello World!"


ユーザー独自のパスに別のlsを置き、これを使用してオリジナルをフックします。
peterh-2015年

回答:


12

エイリアスは、必要なことを簡単に実行するのに十分なほど強力ではない場合があるため、ここではエイリアスを使用しない方法を示します。

シェルの起動時に読み込まれるファイル(など.bashrc)に、次の関数を追加します。

ls () {
    echo "Hello world!"
    command ls "$@"
}

エイリアスとは異なり、関数は再帰できます。これがのcommand ls代わりに使用される理由ですlsls定義した関数の代わりに実際のシェルを使用するようにシェルに指示します。


2
確かに。このソリューションは、拡張性に優れています。+1
PythonNut 2015年

commandOS X の代替手段は何ですか?
IonicăBizău

@IonicăBizău commandうまくいかなかったとは思いません:/ わかりませんし、それをテストできるMacがありません。
地下

9

呼び出すことを忘れないでくださいls

alias ls='echo "Hello World!"; ls'

ハ!これは無限のサイクルを作成すると思いました!しかし、なぜそれは無限ループを作成しないのですか?
IonicăBizău

1
代わりに、エイリアスls 'echo "Hello World!"を試してみてください。/ usr / bin / ls '
jamesqf

5
@IonicăBizău与えられた「エイリアス拡張ルール」は一度しか使用されません。
David Z

&でこの2つを結合することもできますか?それはまた、カスタムコマンドが機能する場合にのみユーザーのコマンドが実行されることを保証しますよね?
モニカの訴訟に資金を提供

@QPaysTaxes &確かに使用できますが、私はそれからあなたの主張を理解できません。
Hauke Laging、2015年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.