linux - shell脚本看不到远程目录中的文件

标签 linux bash shell ssh zsh

我正在尝试在远程服务器上编写交互式脚本,其默认 shell 是 zsh。我一直在尝试两种不同的方法来使其发挥作用:

方法 1: ssh -t <user>@<host> "$(<serverStatusReport.sh)"

方法 2: ssh <user>@<host> "bash -s" < serverStatusReport.sh

到目前为止,我一直很好地使用方法 1,但遇到以下问题时 - 我有一个代码块,该代码块的运行取决于当前目录中是否存在某些文件:

filename="./service_log.*"
if ls $filename 1> /dev/null 2>&1 ; then
    echo "$filename found."
    ##process files
else
    echo "$filename not found."
fi 
  1. 如果我通过 ssh 进入服务器并直接运行命令,我会看到“$filename found”。
  2. 如果我使用方法 1 运行上面的代码块,我会看到“$filename not found”。
  3. 如果我将此 block 复制到一个新脚本中(我们称之为 script2),并使用方法 2 运行它,那么我会看到“$filename found”。

我一生都无法弄清楚这种差异是从哪里来的。我认为不同之处可能在于 script2 通过管道传输到 bash,而我的原始脚本正在使用 zsh 运行...但考虑到在服务器上逐字运行相同的命令,使用其默认的 zsh shell,可以正确返回...我被难住了。

:(任何帮助将不胜感激!

最佳答案

我猜当执行方法 1 时,本地 shell 会扩展 "$(<serverStatusReport.sh)" ,而不是 Remote 。您可以通过以下方式轻松检查:

ssh -t <user>@<host> "$(<hostname)"

serverStatusReport.sh脚本也在本地主机的 PATH 中吗?

我不明白的是为什么您收到此消息而不是错误消息。

关于linux - shell脚本看不到远程目录中的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32707028/

相关文章:

linux - 在 bash 中使用 if-else 连接 xargs

bash - 如何替换文件名中的文本并将文件移动到不同的目录

linux - bash 脚本中的参数数量

另一个磁盘上的 Linux (Centos) 和 Nginx 权限

linux - 在 supervisorctl ERROR 上出现 Supervison 错误(没有这样的过程)

c - 如何在 c 中为每个函数调用创建新线程

linux - 可选的命令行参数 Shell

bash - 使容器自行停止

linux - 将前一天的文件发送到 unix 中的服务器

bash - 如何在 awk 脚本中使用 shell 变量?