当文件存在时,Bash返回一个没有这样的文件

时间:2014-10-08 20:03:32

标签: linux bash

我试图在日志文件上运行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命令运行之前抛出错误有点奇怪但是我没有解释

1 个答案:

答案 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以更改为正确的目录。