我试图在日志文件上运行grep命令来获取用于某些功能的URL。问题是每当我尝试运行它时它会一直给我No such file or directory
错误。我认为这很奇怪所以我用ls
命令作为前缀,看看它是否确实存在并且看到它确实在那里。有人能告诉我这是什么问题,我觉得这是一个语法问题,我不知道,但我无法弄清楚。
#!/bin/bash
for i in `seq 1 3` ;
do
ssh user@member${i}.domain.com << EOF
cd /home/path/member${i}/logs
ls #I've printed the output of this below
test=$( grep -oP "http:.*microwebapp/$" "messages.log" )
echo "Test variable = ${test}"
exit
EOF
done
ls
命令的输出如下:
console.log
messages.log
status.log
trace.log
所以我对所发生的事情感到很困惑,我也尝试用"messages.log"
取代"./messages.log"
无效。
编辑:这是循环的一次迭代的完整输出:
grep: ./messages.log: No such file or directory
Pseudo-terminal will not be allocated because stdin is not a terminal.
console.log
messages.log
status.log
trace.log
Test variable =
我认为grep
命令在ls
命令运行之前抛出错误有点奇怪但是我没有解释
答案 0 :(得分:6)
因为你的&#34;普通&#34; heredoc,这些行在你的本地机器上执行,之前 shell控制到ssh
test=$( grep -oP "http:.*microwebapp/$" "messages.log" )
echo "Test variable = ${test}"
尝试:
ssh user@member${i}.domain.com << EOF
cd /home/path/member${i}/logs
ls #I've printed the output of this below
test=\$( grep -oP "http:.*microwebapp/$" "messages.log" )
#....^
echo "Test variable = \$test"
#.....................^
exit
EOF
by&#34; plain&#34; heredoc,我的意思是终止词是不引用的。人们可以在单词中加上单引号,并且有效地单引号引用整个heredoc:
ssh remote_host <<'END'
#.................^...^
h=$(hostname)
d=$(date)
echo The time at $h is $d
END
您无法在代码中执行此操作,因为您依赖于扩展本地var $i
以更改为正确的目录。