bashプロンプトでファイル名全体をタップしようとすると、出力は多くの(> 100)ファイル名になり、シェルは次のように尋ねます。Display all <num> possibilities? (y or n)
ls
通常のコマンドを使用してこの動作を複製できますか?
400,000を超えるファイルを含むディレクトリがあります。誤ってls
このディレクトリにアクセスすると、シェルが長時間応答しなくなり、出力がこぼれる可能性があります。Ctrl-C
洪水は止まらない。
ベストアンサー1
私の解決策は少し重いかもしれませんが、誰が知っていますか?
問題は、これを行うにはファイル数を数える必要があることです。通常、次のように実行されます。
$ ls | wc -l
コンテンツはstdoutの代わりにパイプに書き込まれるため、完了には少し時間がかかります(ターミナルへの書き込みには少し時間がかかります。これは400,000回の呼び出し後に重要になります)。write(2)
)。それでも時間がかかるかもしれませんが、それでも簡単なテストでこれを達成できます。
#!/bin/bash
LIMIT=1000
n=$(ls "$@" 2>/dev/null | head -n$LIMIT | wc -l)
if [ $n -ge $LIMIT ]; then
echo "This directory contains more than $LIMIT entries."
echo -n "Are you sure want to continue? (y/N) "
read confirm
if [ "$confirm" = "y" -o "$confirm" = "Y" ]; then
exec ls "$@"
fi
else
exec ls "$@"
fi
次に、ファイルにエイリアスを設定し、.bashrc
代わりにこのスクリプトを呼び出します/bin/ls
。
alias ls='/path/to/my_ls.sh --color=auto'
また、正しくchmodedされていることを確認してください。
$ chmod +x /path/to/my_ls.sh
編集する:出力行の後に終了head
呼び出しを追加しました。これは時間を節約し、実際にはより良い解決策になります;)ls
$LIMIT
timeout
私が提案したいもう一つのアプローチは、時間制限を使用することです。 5秒以内に完了しない場合は、停止して確実であるかどうかls
尋ねます。以下はサンプルスクリプトです(ただ1つではなく複数のコマンドに有効ですls
)。
#!/bin/bash
TIMEOUT=5
if [ $# -le 0 ]; then
echo "Usage: $0 [command]"
exit 1
fi
# Try it silently for a few seconds...
timeout $TIMEOUT "$@" >/dev/null 2>&1
if [ $? -eq 124 ]; then
echo -n "Your command failed to run under "$TIMEOUT"s. "
echo -n "Retry without a timeout? (y/N) "
read confirm
if [ "$confirm" = "y" -o "$confirm" = "Y" ]; then
exec "$@"
fi
else
exec "$@"
fi
その後、次のエイリアスを設定できます。
alias ls='/path/to/script.sh ls --color=auto'
alias grep='/path/to/script.sh grep --color=auto'
alias cat='/path/to/script.sh cat'
テスト中ですので参考にしてください$? -eq 124
..
コマンドがタイムアウトして
--preserve-status
設定されていない場合は、状態124で終了する。
バラよりtimeout(1)
より多くの情報を知りたいです。