我有一个简单的bash脚本,它在循环中运行一些程序3次(/home/oren/Downloads/users.txt文件只有一行)
#!/bin/bash
#######################
# Loop over all users #
#######################
while IFS='' read -r username
do
for answer in {1..3};
do
##############################################
# Only perform check if both files exist ... #
##############################################
if [ -f /home/oren/Downloads/someFile.txt ] && [ -f /home/oren/Downloads/anotherFile.txt ];
then
gdb --args /home/oren/Downloads/MMM/example PPP DDD
fi
done
done < /home/oren/Downloads/users.txt
这是/home/oren/Downloads/users.txt文件:
cat /home/oren/Downloads/users.txt
答案是:
OrenIshShalom
当我删除 gdb --args 前缀时,程序正常(也就是说,它会像它应该的那样除以零) 这是程序:
#include <stdio.h>
int main(int argc, char **argv)
{
int i=0;
if (argc > 1)
{
i = (i+argc)/(argc-3);
}
}
但是当我添加gdb --args时,gdb 立即退出:
...
(gdb) quit
这里发生了什么?谢谢!
编辑:
当我移除外部循环 gdb工作正常 ...但我非常喜欢保持此循环,因为脚本中的所有内容都构建在其上
答案 0 :(得分:1)
整个while
循环(包括read
和gdb
)将共享 stdin /home/oren/Downloads/users.txt
,因此gdb
也会消耗/home/oren/Downloads/users.txt
的数据。 gdb
会立即退出,因为它会快速消耗所有数据并看到EOF。
参见以下示例:
[STEP 109] # cat file
line 1
line 2
line 3
[STEP 110] # cat foo.sh
while read line; do
gdb /bin/ls
done < file
[STEP 111] # bash foo.sh
GNU gdb (Debian 7.12-6) 7.12.0.20161007-git
Copyright (C) 2016 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
[...]
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from /bin/ls...(no debugging symbols found)...done.
(gdb) Undefined command: "line". Try "help".
(gdb) Undefined command: "line". Try "help".
(gdb) quit
[STEP 112] #
对于您的情况,您可以将文件/home/oren/Downloads/users.txt
加载到数组并完成它:
usernames=()
nusers=0
while IFS='' read -r username; do
usernames[nusers++]=$username
done < /home/oren/Downloads/users.txt
for username in "${usernames[@]}"; do
...
gdb ...
...
done