防止在运行自定义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

如果有六个以上的文件,这不会产生警告,但我实际上认为这是一个功能。

相关内容

  • 没有找到相关文章

最新更新