Bash命令替换在早期代码之前执行

时间:2015-07-01 16:24:01

标签: bash shell unix terminal

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查询之前),因此尚未创建该文件。有没有办法强迫它按照其编写的顺序执行,或者有更好的方法来执行此操作吗?

1 个答案:

答案 0 :(得分:2)

在调用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'"