最初のプロンプトを表示した後、シェル(自動)ソースファイルを使用できますか?

最初のプロンプトを表示した後、シェル(自動)ソースファイルを使用できますか?

方法があるかどうかを知りたい私のスタートアップファイルにいくつかのコンテンツを追加します。これにより別のファイルがインポートされます。最初のプロンプトが表示された後。

preexec私は、precmdまたはHooksのようなperiodicフックに頼らないアプローチを好みます。 (私はzshを使用していますが、人々が巧妙なハックtrapや同様の方法でbashに追加するコードを書いたことを知っています。)

非常に簡単な最初のテスト(私は動作することを期待していませんが、正確な結果を確認するために試してみる必要性を感じました)を出して.zshrc

{ sleep 100 && export VARIABLE_SET=1 } &

次に、シェルがロードされてから100秒前後にこのコマンドを実行します。

echo $VARIABLE_SET

もちろんそれは(そして私が考えることができるすべての順列)失敗し、それを行う方法について有望な手がかりを提供しません。

最初のプロンプトですぐに利用できなくても、起動ファイルの何かがシェルに影響を与えるソースをトリガーしたいと思います。起動ファイルを膨らませる多くのものが頻繁に必要ないため、「高価な」購入を遅らせ、プロンプトがすばやく表示されるようにする方法を見つけたいと思います。

precmd私はフックを使用するよりも簡単な方法を探したいと思います(しかし他の方法がない場合に備えて、フックを使用して概念証明を作成しました)。

ベストアンサー1

前述のようにバックグラウンドでコマンドを実行すると、そのコマンドは&サブシェルに入り、サブシェルは親プロセスの変数/環境変数を変更できません。 (「できない「この文は次のように読んでください。解決策は醜い.)

sourceしたがって、現在のシェルでコマンドを実行する必要があります。以下にいくつかのオプションをリストします。

これらのどれもあなたが要求した質問に対する完全な答えではありませんが、あなたが解決しようとしている実際の問題に対する解決策を提供するようです。

zsh-defer(zshスクリプト)

.zshrc:

# load zsh-defer:
source "$HOME/zsh-defer.plugin.zsh"

# ... misc. commands ...

# defer 'source "$HOME/file"' for later execution:
zsh-defer source "$HOME/file"

繰り返しの呼び出しにより、必要な数のコマンドなどをプロンプトできますsource .zshrc.2source .zshrc.3zsh-defer

特典:管理が難しい多くのzinitエッジケースを処理します。より複雑なソリューションよりもsched

パフォーマンス: zsh-deferこれ自体は最大数ミリ秒以内にロードする必要があります。

実装する:zle(zshの行エディタ)でコマンドを実行します.

zshzsh/schedモジュール

(提案通り@StéphaneChazelasの以前の回答)

シンプルで直接的です。

.zshrc:

sched +10 "source $HOME/file" &>/dev/null || source "$HOME/file"

この... &>/dev/null || ...部分:sched使用できない場合やエラーが原因で終了した場合は、ファイルがまったくないよりも優れていると想定してすぐにファイルをインポートします。

詳細sched:参照zshのドキュメント

欠点:

  • コマンドの実行に長い時間がかかると、実行中にシェルがブロックされます。
  • Yearly check: do <evil thing>? [y/N]遅延コマンドがコマンドを入力するときに予期せずユーザー入力( "")を要求した場合、誤って入力される危険性があります。

パフォーマンス:このschedコマンドの実行には最大数ミリ秒かかることがあります。

使用パワーレベル10kヒント即時通知

.zshrc追加の作業は必要ありません。処理中に目的の操作を.zshrc実行すると、プロンプトがロードされ、対話する準備が整います(いくつかの注意事項があります)。

パフォーマンス:シェルが処理を開始した後、約10ミリ秒以内にプロンプ​​トが表示されます.zshrc

実装する:様々なzsh機能とコツ。誤って入力されないようにコマンドを実行するときにstdinをリダイレクト(およびバッファリング)するなど、特別な注意が必要です。

プラグインマネージャzinit

zinitこれを使用して、zinit ice waitファイルのインポートなどのコマンドの実行を遅らせることができます。

zinitプラグインマネージャとして使用せず、この機能にのみ使用でき、他のプラグインマネージャ(存在する場合)を妨げません。

元のバージョンはzdharma/zinitもはや保持されませんが、これらのフォークは次のとおりです。

長期実行コマンドがシェルをブロックするとは思わないが、直接テストすることはなかった。

パフォーマンス:私のシステムでは、それzinit自体をロードするのに約10msかかり、完了せずに5msかかります。

実装する: zinitzsh/sched呼び出し時にすぐにテーブルに再度追加され、ユーザーが設定したコマンドをsched実行するシェル関数を追加するには、次のようにします。zshフックその他のzsh機能。

zsh-async図書館

役に立つかもしれません。完全性のために言及しました。

zshで非同期ジョブを実行するための小さな汎用ライブラリ。それ〜するただし、別のプロセスで実行すると、環境変数は親シェルに設定されません。結果が親シェルで実行されるようにコールバック関数を割り当てると、いくつかの簡単な回避策があると思います。

特典:これはかなり広く使用され、8年間積極的に維持されてきました。

実装する:zsh/zpty遅延命令の実行を開始するために使用される擬似端末。


おすすめブック

ロンカテレビ(著者zsh-deferパワーレベル10k)段階的なzshの開始に関する一般的な考えと提案/遅延ローディング/遅延実行。

シェルのロードパフォーマンスに関する追加のよくある質問

尋ねる:.zshrcより速く実行するようにワードコードにコンパイルできますか?
ㅏ:理論的には可能ですが、エイリアス、再コンパイルの欠落などが発生しやすいです。お勧めできません。
尋ねる:今何が間違っているのか理解しています。私はまだこれを試してみたいです。
ㅏ:いいえ、実際にはそうではありません。

おすすめ記事