Bash 在较早的代码之前执行的命令替换
Bash command substitution executing before earlier code
ssh -i "path/to/my/key.key" ip.ip.ip.ip "mkdir a/a; sql 'query;' > a/a/file.txt; if [ -f a/a/file.txt ]; then if [ $(wc -l a/a/file.txt) -ge 2 ]; then echo 'done'; fi; fi; exit"
通过 ssh 连接后,我基本上是在创建目录,将 sql 查询写入文件。如果该文件存在,那么我检查它的字数是否大于 1。如果字数大于 1,我回显完成,然后退出。
但是,我得到这个错误:
wc: a/a/file.txt open: No such file or directory
似乎命令替换 $(wc -l a/a/file.txt)
首先执行(至少在 sql 查询之前),因此文件尚未创建。有什么方法可以强制它按照写入的顺序执行,还是有更好的方法来做到这一点?
您需要在调用 ssh
之前保护命令替换不被扩展;您可以将整个命令用单引号括起来,或者简单地在双引号内转义 $
(此处显示)。 (为清楚起见插入了换行符;它们不是必需的,但如果需要可以使用。)
ssh -i "path/to/my/key.key" ip.ip.ip.ip "mkdir -p a/a
sql 'query;' > a/a/file.txt
[[ $(wc -l < a/a/file.txt) -ge 2 ]] && echo 'done'"
-f
测试是不必要的; shell 在 运行 sql
之前创建文件,并且无论命令是否产生任何输出,文件都将存在。 exit
也是不必要的; shell 将在最后一条命令执行后立即退出。
一种(hacky?)完全避免命令替换的方法是简单地尝试使用 read
:
从文件中读取 2 行
ssh ... "mkdir -p a/a
sql 'query;' > a/a/file.txt
{ read && read; } < a/a/file.txt && echo 'done'"
ssh -i "path/to/my/key.key" ip.ip.ip.ip "mkdir a/a; sql 'query;' > a/a/file.txt; if [ -f a/a/file.txt ]; then if [ $(wc -l a/a/file.txt) -ge 2 ]; then echo 'done'; fi; fi; exit"
通过 ssh 连接后,我基本上是在创建目录,将 sql 查询写入文件。如果该文件存在,那么我检查它的字数是否大于 1。如果字数大于 1,我回显完成,然后退出。
但是,我得到这个错误:
wc: a/a/file.txt open: No such file or directory
似乎命令替换 $(wc -l a/a/file.txt)
首先执行(至少在 sql 查询之前),因此文件尚未创建。有什么方法可以强制它按照写入的顺序执行,还是有更好的方法来做到这一点?
您需要在调用 ssh
之前保护命令替换不被扩展;您可以将整个命令用单引号括起来,或者简单地在双引号内转义 $
(此处显示)。 (为清楚起见插入了换行符;它们不是必需的,但如果需要可以使用。)
ssh -i "path/to/my/key.key" ip.ip.ip.ip "mkdir -p a/a
sql 'query;' > a/a/file.txt
[[ $(wc -l < a/a/file.txt) -ge 2 ]] && echo 'done'"
-f
测试是不必要的; shell 在 运行 sql
之前创建文件,并且无论命令是否产生任何输出,文件都将存在。 exit
也是不必要的; shell 将在最后一条命令执行后立即退出。
一种(hacky?)完全避免命令替换的方法是简单地尝试使用 read
:
ssh ... "mkdir -p a/a
sql 'query;' > a/a/file.txt
{ read && read; } < a/a/file.txt && echo 'done'"