【发布时间】:2017-11-28 01:52:28
【问题描述】:
我正在尝试在几个远程主机上并行运行几组命令。 我创建了一个构建这些命令的脚本,然后将输出写入本地文件,类似于:
ssh <me>@<ip1> "command" 2> ./path/to/file/newFile1.txt & ssh <me>@<ip2>
"command" 2> ./path/to/file/newFile2.txt & ssh <me>@<ip2> "command" 2>
./path/to/file/newFile3.txt; ...(same repeats itself, with new commands and new
file names)...
我的问题是,当我的脚本运行这些命令时,我收到以下错误:
bash: ./path/to/file/newFile1.txt: No such file or directory
bash: ./path/to/file/newFile2.txt: No such file or directory
bash: ./path/to/file/newFile3.txt: No such file or directory
...
这些文件不存在,但会被写入。话虽如此,目录路径是有效的。
奇怪的是,如果我复制并粘贴整个大命令,那么它可以正常工作。我宁愿让它自动化;)。
有什么想法吗?
编辑 - 更多信息:
我的文件系统如下:
- home
- User
- Desktop
- Servers
- Outputs
- ...
我正在从 home/User/Desktop/Servers 运行 bash 脚本。 该脚本创建需要在远程服务器上运行的命令。首先,脚本创建将存储文件的目录。
outputFolder="./Outputs"
...
mkdir -p ${outputFolder}/f{fileNumb}
...
然后脚本继续创建将在远程主机上调用的命令,它们各自的输出将放置在创建的目录中。 目录在那里。运行命令会给我错误,但是出于某种原因,打印然后将命令复制到同一位置是可行的。我也试过给出目录的完整路径,还是一样的问题。
希望我说得清楚一点。
【问题讨论】:
-
路径必须存在才能进行重定向(中间目录不会自动创建)。所以
mkdir -p path/to/file在重定向之前> path/to/file/newFile.txt。 -
您的问题似乎没有包含足够多的相关信息,因此只能进行猜测。请提供问题的minimal, complete, and verifiable example,以便所有相关信息(以及最少的不相关信息)都在这里。
-
你的问题 still 没有包含足够的信息来实际说明正在发生的事情——这就是创建 MCVE 的重点。但是您提到“创建命令”让我感到怀疑——您是否尝试在执行命令之前将命令存储在变量中?如果是这样,有很多事情可能会出错。见BashFAQ #50: I'm trying to put a command in a variable, but the complex cases always fail!。
-
我刚刚意识到我的错误是没有在包含我的命令字符串的变量上调用“eval”。应该从一开始就给出完整的脚本,你是对的。将确保我的下一个问题包含 MCVE。
-
@dtam
eval在 shell 脚本中几乎从来都不是正确的答案。当你测试它们时编写完美运行的脚本真的很容易,但是通常会在一些数据中出现一些意想不到的元字符,改变所有内容的解析方式,突然间你认为只是数据的东西正试图作为命令执行.. . 基本上,它是一个巨大的footgun。几乎总是有更好的方法来做到这一点。 BashFAQ #50 有一些很好的建议,但如果它们都不适合您的情况,我建议您询问最好的方法(作为一个新问题)。
标签: bash file unix ssh remote-server