运行自定义bash函数时阻止终端关闭

时间:2012-12-14 11:33:32

标签: linux bash

我在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打开它们。

每当我在终端中运行此功能时,它都会关闭。 你能告诉我我能做些什么让它保持开放吗?

1 个答案:

答案 0 :(得分: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

如果文件超过六个,则无法生成警告,但实际上我会考虑这个功能。