gpt4 book ai didi

linux - Bash 在文件存在时返回一个没有这样的文件

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:47:43 24 4
gpt4 key购买 nike

我正在尝试对日志文件运行 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 命令运行之前抛出错误有点奇怪,但我也没有对此的解释

最佳答案

因为你的“普通”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

“普通”heredoc 是指终止词未被引用。可以在单词周围加上单引号,这有效地单引号了整个 heredoc:

ssh remote_host <<'END'
#.................^...^
h=$(hostname)
d=$(date)
echo The time at $h is $d
END

你不能在你的代码中这样做,因为你依赖于扩展本地变量 $i 来切换到正确的目录。

关于linux - Bash 在文件存在时返回一个没有这样的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26265443/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com