これexec
により、呼び出しシェルの標準入力がファイルから永続的にリダイレクトされます。ファイルが閉じられると、シェルは入力を使い果たし、終了します。source
この関数を;でインポートすると仮定します。スタンドアロンで実行するとうまくいくはずです。
この種の関数を記述する通常の方法は、引数を受け入れるようにすることです。したがって、「open」を実行してプロンプトで「fnord」と入力する代わりに、「open fnord」のように呼び出します。
open () {
local fname
fname=$1 # notice this arrangement instead of read
local value
value=0
locate "$fname" | # notice double quotes
tee /dev/stderr | # as a superior alternative to using a temporary file
while read line
do
value=`expr $value + 1`
if [ $value -le 6 ]
then
gedit "$line" # notice double quotes
else
echo too many files to open >&2 # notice redirection to stderr
fi
done
}
診断は誤解を招きます。このコードは依然として最初の 6 つのファイルを開き、7 番目でエラー メッセージを出して保釈します。それがあなたの意図ですか?それとも、出力の数をカウントし、6 つを超える場合は実行を拒否する必要がありますか?
他の改善を気にしない場合、最小限の修正は、一時ファイルからループの入力を削除しexec
て読み取ることです。while
(適切にクリーンアップするように注意する必要があります。一時ファイルを回避できる場合は、基本的に常により良い解決策です。)
while read line; do
....
done <tempfile
nl
見栄えの悪い を取り除くためにで行番号を追加したくなりますexpr
が、これによりファイル名の先頭にスペースがあると壊れる可能性があります。(一方、locate
常にフルパス名が生成されますよね?)
gedit
別の方法として、複数のファイル名引数を読み取ることができると仮定して、これを試してください。
locate "$fname" | head -n 6 | xargs gedit
6 つを超えるファイルがある場合、これは警告を生成しませんが、実際にはそれが機能であると考えています。