如何在Bash脚本中执行字符串形式的Swift脚本并获取结果?
如何在Bash中直接执行字符串形式的Swift脚本
问题出在哪?
你原来的写法把Swift脚本内容当成了swift命令的文件名参数,但swift默认是要加载脚本文件的,它会尝试去找名为import的文件(就是你脚本的第一个单词),自然找不到,所以才报了那个奇怪的子命令错误。
正确的实现方式
我们可以通过标准输入把脚本内容传给swift,这样完全不需要创建临时文件,给你几种实用的写法:
1. 用Here-String(最推荐,可读性强)
Bash的Here-String可以轻松传递多行字符串,再加上--标记明确区分脚本参数和swift自身的参数:
# 把你的Swift脚本存在环境变量里 APP="import Foundation let path = CommandLine.arguments[1] print(path)" # 执行脚本,同时传递路径参数 xcrun swift -- /path/path2/path3/path4 <<< "$APP"
这里的--一定要加,它告诉swift:后面的/path/...是你的Swift脚本要接收的参数,不是swift命令的参数,避免搞混。
2. 用管道配合echo
如果你习惯管道语法,也可以这样写:
APP="import Foundation let path = CommandLine.arguments[1] print(path)" echo "$APP" | xcrun swift -- /path/path2/path3/path4
效果和上面完全一样,只是传递方式不同。
3. 单行短脚本用-e参数
如果你的Swift脚本是单行的,直接用swift的-e参数执行表达式更简洁:
xcrun swift -e 'import Foundation; let path = CommandLine.arguments[1]; print(path)' -- /path/path2/path3/path4
多行脚本用这种方式需要用分号分隔语句,可读性不如前两种,适合简单逻辑。
测试一下
执行上面的命令后,你应该能看到输出:
/path/path2/path3/path4
内容的提问来源于stack exchange,提问作者Andrew Romanov
相关产品推荐
相关产品推荐

