我在我的 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/