我在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
如果有六个以上的文件,这不会产生警告,但我实际上认为这是一个功能。