已关闭,此问题需要details or clarity。目前不接受答复。
**想改善这个问题吗?**通过editing this post添加详细信息并澄清问题。
4天前关闭。
Improve this question
我可以写命令
exec sleep '5'
而且效果很好
但假设我有一个叫做cmd的文件。包含以下字符串的txt
sleep '5'
我想把它读入一个变量,然后执行这个命令。
cmd=$(cat cmd.txt)
exec $cmd
那这就失败了。
+ exec sleep ''\''5'\'''
sleep: invalid time interval ‘'5'’
Try 'sleep --help' for more information.
sleep命令是一个简单的例子来演示这个问题,真实的的命令是一个冗长的java命令,其中还包含一些单引号。它需要是exec而不是eval,因为我们需要替换当前进程。
解决方法是创建一个文件,文件中后跟“exec”命令,然后运行。
. file
但我想避免创建一个文件只是为了这样做。
完整的命令是,并且是由其他一些代码生成的
/opt/java/jdk-17.0.6+10/bin/java -Djava.io.tmpdir=/tmp -Djetty.home=/home/lachlan/webtide/jetty-10.0.x/jetty-home/target/jetty-home -Djetty.base=/tmp/jetty-test --class-path /tmp/jetty-test/resources:/home/lachlan/webtide/jetty-10.0.x/jetty-home/target/jetty-home/lib/logging/slf4j-api-2.0.5.jar:/home/lachlan/webtide/jetty-10.0.x/jetty-home/target/jetty-home/lib/logging/jetty-slf4j-impl-10.0.15-SNAPSHOT.jar:/home/lachlan/webtide/jetty-10.0.x/jetty-home/target/jetty-home/lib/jetty-servlet-api-4.0.6.jar:/home/lachlan/webtide/jetty-10.0.x/jetty-home/target/jetty-home/lib/jetty-http-10.0.15-SNAPSHOT.jar:/home/lachlan/webtide/jetty-10.0.x/jetty-home/target/jetty-home/lib/jetty-server-10.0.15-SNAPSHOT.jar:/home/lachlan/webtide/jetty-10.0.x/jetty-home/target/jetty-home/lib/jetty-xml-10.0.15-SNAPSHOT.jar:/home/lachlan/webtide/jetty-10.0.x/jetty-home/target/jetty-home/lib/jetty-util-10.0.15-SNAPSHOT.jar:/home/lachlan/webtide/jetty-10.0.x/jetty-home/target/jetty-home/lib/jetty-io-10.0.15-SNAPSHOT.jar org.eclipse.jetty.xml.XmlConfiguration 'java.version'='17.0.6' 'java.version.major'='17' 'java.version.micro'='6' 'java.version.minor'='0' 'java.version.platform'='17' 'jetty.base'='/tmp/jetty-test' 'jetty.base.uri'='file:///tmp/jetty-test' 'jetty.home'='/home/lachlan/webtide/jetty-10.0.x/jetty-home/target/jetty-home' 'jetty.home.uri'='file:///home/lachlan/webtide/jetty-10.0.x/jetty-home/target/jetty-home' 'jetty.http.port'='8181' 'jetty.webapp.addServerClasses'='org.eclipse.jetty.logging.,file:///home/lachlan/webtide/jetty-10.0.x/jetty-home/target/jetty-home/lib/logging/,org.slf4j.' 'runtime.feature.alpn'='true' 'slf4j.version'='2.0.5' /home/lachlan/webtide/jetty-10.0.x/jetty-home/target/jetty-home/etc/jetty-bytebufferpool.xml /home/lachlan/webtide/jetty-10.0.x/jetty-home/target/jetty-home/etc/jetty-threadpool.xml /home/lachlan/webtide/jetty-10.0.x/jetty-home/target/jetty-home/etc/jetty.xml /home/lachlan/webtide/jetty-10.0.x/jetty-home/target/jetty-home/etc/jetty-http.xml
2条答案
按热度按时间m3eecexj1#
我会写字
Bash不是一种宏替换语言。你写的什么!= bash扩展什么,写什么,扩展的结果是什么,有不同的规则。
不应该将命令存储在变量中。使用bash数组。读取https://mywiki.wooledge.org/BashFAQ/050。
如果你真的不能,并且你有一个命令,有时只是引用,你可以用
xargs
解析引号:如果你真的不能,并且你有一个命令,就像它会在命令行上输入一样,包括任何命令替换,文件名扩展等等,那么你必须生成一个子shell:
注意引号。用shellcheck检查你的脚本!
ttvkxqim2#
在
exec $cmd
中,shell不解析引号,因为引号删除发生在参数展开之前。因此,命令sleep
接收字符串'5'
作为参数,这确实不是一个有效的数字。你会得到同样的效果
在
sleep '5'
中,shell执行引号删除,sleep
将字符串5
视为参数。