【发布时间】:2021-11-08 07:22:17
【问题描述】:
我有一个虚拟机,其中有一个文件夹 A,其中包含 doc1.txt doc2.txt king1.so 和 king2.so
我正在尝试使用来自另一个 VM 的 ssh 列出特定扩展名的文件。
VAR_PATH="/predefined/path/to/A"
echo $VAR_PATH
for file_path in `ssh user@xxx.xxx.xxx.xxx "find $VAR_PATH -iname "*.so""`
do
echo $file_path
done
这不起作用并给我错误
find:路径必须在表达式之前:sample.so 用法:find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path...] [expression]
当我在find 命令中硬编码路径时,相同的命令起作用
for file_path in `ssh user@xxx.xxx.xxx.xxx "find /predefined/path/to/A -iname "*.so""`
do
echo $file_path
done
如何在这个 for 循环中的 ssh 命令中传递路径变量
【问题讨论】:
-
快速说明 -- 你真的不想在这里使用反引号;它们改变了其他反引号和反斜杠在其中的行为方式。
$( )是进行命令替换的现代方式,它自 1990 年代初就已标准化,因此真的没有任何借口。 -
无论如何——我更担心你代码中的
*.so。双引号在到达远程服务器之前丢失了。设置为"set -x; find ...",您将能够看到服务器如何解释它接收到的命令。 -
(虽然quotes-getting-lost 不是远程服务器问题;这是本地解析问题:
"foo""bar"完全与"foobar"相同-- 成对的双引号只是相互抵消;不像其他一些语言,它们只翻译成一个字面引号)。 -
另外,
for file_path in $(anything)是一个整体的反模式。见BashPitfalls #1; BashFAQ #1 中记录了逐行读取流的正确方法,BashFAQ #24 中介绍了如何将ssh之类的命令的输出馈送到此类循环中的注意事项。 -
除非循环体有更多内容,否则根本不需要。