0

Linuxのbashrcに次のプログラムを書きました

open()
{
  echo enter file name
  read fname
  locate $fname> /home/vvajendla/Desktop/backup/loc;
  cat loc
  exec < /home/vvajendla/Desktop/backup/loc;
  value=0
  while read line
  do
    value=`expr $value + 1`;
    echo $value 
    echo $line
    if [ $value -le 6 ]
    then
      gedit $line;
    else 
      echo too many files to open
    fi 
  done

}

上記の関数は、一致するファイル文字列のすべてのディレクトリを検索し、ディレクトリが 6 以下の場合は GEDIT を使用してそれらを開きます。

ターミナルでこの関数を実行すると、閉じられます。開いたままにするにはどうすればよいか教えてください。

4

1 に答える 1

3

これ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 つを超えるファイルがある場合、これは警告を生成しませんが、実際にはそれが機能であると考えています。

于 2012-12-14T12:13:36.670 に答える