我在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打开它们。
每当我在终端中运行此功能时,它都会关闭。 你能告诉我我能做些什么让它保持开放吗?
答案 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
如果文件超过六个,则无法生成警告,但实际上我会考虑这个功能。