sleep
実行速度を低下させるコマンドや何かがある場合は、それらを.bashrc
プロファイリングして次のように遅い部分を確認できます。
$ printf "set -x\nPS4='+\\\\t '\nexport HISTFILE=empty\nsleep 4\ntrue\n" > mybashrc
$ > empty
$ time bash --rcfile mybashrc -i <<< exit
+ PS4='+\t '
+19:13:47 export HISTFILE=empty
+19:13:47 HISTFILE=empty
+19:13:47 sleep 4
+19:13:51 true
$ exit
+19:13:51 exit
exit
real 0m4.022s
user 0m0.010s
sys 0m0.010s
そして
その他
オプション
精度を上げるにはGNUを使用してくださいdate
。
しかし、次のような大規模なbash履歴ファイルがあるとしましょう。
$ yes ls | head -n 9999999 > big-hist
$ du -sh big-hist
29M big-hist
これで、シェルも非常にゆっくりと起動しますが(マイコンピュータでは約4秒)、時間がどこにかかるのかわかりません.bashrc
。
$ printf "set -x\nPS4='+\\\\t '\nexport HISTSIZE=-1\nexport HISTFILESIZE=-1\nexport HISTFILE=big-hist\ntrue\n" > mybashrc
$ time bash --rcfile mybashrc -i <<< exit
+ PS4='+\t '
+19:12:23 export HISTSIZE=-1
+19:12:23 HISTSIZE=-1
+19:12:23 export HISTFILESIZE=-1
+19:12:23 HISTFILESIZE=-1
+19:12:23 export HISTFILE=big-hist
+19:12:23 HISTFILE=big-hist
+19:12:23 true
$ exit
+19:12:27 exit
exit
real 0m4.184s
user 0m3.641s
sys 0m0.536s
私が思いつく最善の推測は、次のように実行することです。
$ time bash -i <<< exit
$ SHLVL=2 $ exit
exit
real 0m0.400s
user 0m0.326s
sys 0m0.075s
次に最後の行を追加します.bashrc
。
HISTFILE=/dev/null
そしてやり直してください:
$ time bash -i <<< exit
$ exit
exit
real 0m0.081s
user 0m0.059s
sys 0m0.023s
これが履歴ファイルの処理に費やされた時間だけを測定するかどうかは完全にはわかりません。
(注:自分で試してみると、.bashrc
タイミングが完了した後に最後の行を削除することを忘れないでください!)
私は何年も持っていたので、これは私にとって特に興味深かったです。
有効
無限の歴史
私の場合、.bashrc
新しい対話型シェルの開始時間が影響を受けたことがわかりました。上記のタイミングが正しいと、遅延時間は300ミリ秒を超えました。
答え1
私はあなたの測定を信頼しない理由はありません。
ただしbash
、これを実行するstrace
と、ファイルが開く順序を確認できます。
$ strace -t -f -e trace=file bash -i <<<exit 2>&1 | grep -E 'open(at)?\(' ; fg
[...]
03:10:39 openat(AT_FDCWD, "/home/hl/.bashrc", O_RDONLY) = 4
03:10:39 openat(AT_FDCWD, "/home/hl/.DISPLAY", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 4
03:10:39 openat(AT_FDCWD, "/etc/inputrc", O_RDONLY) = 4
03:10:39 openat(AT_FDCWD, "/etc/inputrc.keys", O_RDONLY) = 4
03:10:39 openat(AT_FDCWD, "/etc/inputrc.keys", O_RDONLY) = 4
03:10:39 openat(AT_FDCWD, "/etc/inputrc.keys", O_RDONLY) = 4
03:10:39 openat(AT_FDCWD, "/home/hl/.inputrc", O_RDONLY) = 4
03:10:39 openat(AT_FDCWD, "/home/hl/.bash_history", O_RDONLY) = 4
03:10:39 openat(AT_FDCWD, "/home/hl/.bash_history", O_RDONLY) = 4
03:10:39 openat(AT_FDCWD, "/etc/localtime", O_RDONLY|O_CLOEXEC) = 4
fg
これがなぜ必要なのかわかりません。おそらく、シェルをバックグラウンドで送信することは私のシェル構成にあるかもしれません。