.bashrcのこの行により、Bashの起動が遅くなります。何がこれを引き起こす可能性がありますか?


19

私の.bashrcファイルには、この効果に対する行が含まれています。

alias prog="/path/to/script.sh $(find $(pwd) -name prog)"

この行をコメントアウトすると、新しいターミナルを開くとほぼ即座にBashが起動します。この行では、カーソルが表示されるまでに4〜5秒の遅延があります。

ネストされたコマンド$(pwd)などを削除すると、再び高速化されます。なんでこんなことが起こっているの?それでも、何らかの方法でネストされたコマンドを使用できますか?


4
問題はfindコマンドで、これはブート時に実行され、ディレクトリ構造によっては実行に時間がかかる場合があります。ダブルクォートでfindはなくシングルクォートを使用すると、実行時に実行されaliasます。使用する作業ディレクトリ、宣言時または実行時の現在の作業ディレクトリによって異なります。ちなみに、$(pwd)やや非効率的な表現.方法$PWDです。
AFH

15
私はそれがあなたが求めているものではないことを知っていますが、これはXYの問題によく似ています。を使用してスクリプトを見つける必要があるのはなぜfindですか?一度インストールすると、どこにあるかがわかります。頻繁に更新して名前を変更した場合でも、シンボリックリンクを維持して、常に固定名で使用できるようにすることができます。
-sleske

5
@AFHコメントではなく、回答として回答を投稿してください。
デビッドリチャービー

1
@DavidRicherby-投稿する前に、これが本当に答えであることを確認したかった。私は、スクリプトが任意のディレクトリ内で見つかったファイルで動作することに戸惑っていました。
AFH

回答:


45

コマンド置換は二重引用符で囲まれているため、コマンドの定義時に評価されます。これによりfind.bashrc実行中にハードディスクの内容を調べることができます。

対照的に、あなたは使用時に評価したいようです。その場合は、単一引用符を使用します。

alias prog='/path/to/script.sh $(find "$(pwd)" -name prog)'

見つかったファイルの名前に空白が含まれている場合、このエイリアスは失敗することに注意してください。それを避けるには:

alias prog='find . -name prog -exec /path/to/script.sh {} +'

この後者の形式は、あらゆる種類のファイル名に対して確実に機能します。


1
「使用時間」。そして、2行目はサブシェルの生成を避けます。
-rleir

11
下がり気味で、今あなたが入力するたびにprogfind前のに対し、それは(シェル起動時に)一度だけ実行されます、実行する必要があります。
el.pescado

再度、ファイルキャッシュにより、同じfindものを2回実行すると、通常ははるかに高速になります。
reinierpost

21
@ el.pescado良い点として、意図した動作が、コマンドを実行するためにコマンドを実行したときに存在するファイルではなく、ユーザーがログインしたときに存在したファイルに対してコマンドを実行することだと想像するのは困難です。
デビッドリチャービー

2
@DavidRicherby 古いパスが存在しなくなった場合、パスをキャッシュしてprog再実行findできますか?
アレックスヴォング
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.