0

I wrote the following program in my 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

}

The above function searches all the directories for the file-string match and opens them using GEDIT if they are less than or equal to 6.

whenever i run this function in the terminal,it gets closed. Can you please tell me what i can do to keep it open?

4

1 回答 1

3

exec会导致调用 shell 的标准输入从文件中永久重定向。一旦文件关闭,shell 就会用完输入并退出。我假设你用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

}

诊断具有误导性;此代码仍将打开前六个文件,然后在第七个文件中显示错误消息。那是你的意图吗?还是应该计算输出的数量,如果超过六个就拒绝运行?

如果您不关心其他改进,最小的解决方法是从临时文件中删除exec并读取while循环的输入。(您应该注意正确清理;如果您可以避免临时文件,那基本上总是一个更好的解决方案。)

while read line; do
    ....
done <tempfile

我很想添加行号nl以摆脱不吸引人的expr,但这可能会在开头用空格破坏文件名。(另一方面,locate总是产生一个完整的路径名,对吧?)

作为替代方案,并假设gedit可以读取多个文件名参数,试试这个:

locate "$fname" | head -n 6 | xargs gedit

如果有超过六个文件,这将无法产生警告,但我实际上会认为这是一个功能。

于 2012-12-14T12:13:36.670 回答