我有一个打开perl脚本的shell脚本。这个perl脚本应该在终端中打开。我可以打开终端,但我无法调用cd来访问perl脚本的位置
$PROJECT_DIR = "$PROJECT_DIR";
echo "$PROJECT_DIR" > "$PROJECT_DIR/Testing/buildProductPathHello.txt"
osascript -e 'tell app "Terminal"
do script "pwd"
do script "cd $PROJECT_DIR" in window 1
do script "ls" in window 1
do script "./RunTests.pl" in window 1
end tell'
变量$PROJECT_DIR
包含路径,我通过将路径写入文件来验证这一点。最终,命令cd $PROJECT_DIR
是不起作用的命令。不对变量的内容执行cd。
PS:这是在带有bash shell的mac上
答案 0 :(得分:7)
每个脚本都作为自己的进程运行,执行其操作并退出。脚本的状态(包括环境变量及其当前目录定义)在退出时将被丢弃 - 因此您不能指望除“cd”之外什么都不做的脚本以后仍然有效。
如果你做了这样的事情:
do script "cd $PROJECT_DIR; ls; ./runTests.pl"
...然后,它将在一个shell中执行所有三个命令,结果将是您所期望的。
答案 1 :(得分:3)
在这种情况下不需要cd;只需结合你的两个电话即 在窗口1中编写脚本“$ PROJECT_DIR / ls”
答案 2 :(得分:1)
环境变量也是特定于每个流程的。
使用单引号字符串调用osascript
的方式告诉bash的原始实例不要替换变量名。它实际上会将"cd $PROJECT_DIR"
发送给osascript
,cd $PROJECT_DIR
会将$PROJECT_DIR
发送到终端。
但是在接收bash进程中没有设置do script "set" in window 1
- 在终端窗口内运行的进程。您可以通过添加do script "echo $PROJECT_DIR" in window 1
或osascript -e 'tell app "Terminal"
do script "pwd"
do script "cd '"$PROJECT_DIR"'" in window 1
do script "ls" in window 1
do script "./RunTests.pl" in window 1
end tell'
等行来验证这一点。
如果用变量名称用双引号括起脚本部分,原始的bash过程将替换$ PROJECT_DIR的值:
{{1}}
(CharlesDuffy建议的语法)