linux - 运行自定义 bash 函数时防止终端关闭

标签 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 打开它们。

每当我在终端中运行这个函数时,它就会关闭。 你能告诉我我能做些什么来让它保持打开状态吗?

最佳答案

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

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

关于linux - 运行自定义 bash 函数时防止终端关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13877897/

相关文章:

c++ - 除了静态库之外,我还可以将共享库与 "gcc -llibnamehere"绑定(bind)吗?

linux - 如何在 shell 脚本中导入两个库?

Bash 与减法的比较

linux - 运行简单 shell 脚本时出错

linux - 将 stat 命令输出分配给变量时的错误替换

linux - Bash 文件名前缀替换

c++ - 标准库字符串的 placement new 内存泄漏

linux - 在脚本中重定向 stderr 并添加前缀

regex - 从字符串中修剪字符串

linux - Wget - 输出目录前缀