在shell脚本中调用cd

时间:2012-03-29 16:45:54

标签: macos bash terminal applescript

我有一个打开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。

snapshot of terminal

snapshot 2 PS:这是在带有bash shell的mac上

3 个答案:

答案 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"发送给osascriptcd $PROJECT_DIR会将$PROJECT_DIR发送到终端。

但是在接收bash进程中没有设置do script "set" in window 1 - 在终端窗口内运行的进程。您可以通过添加do script "echo $PROJECT_DIR" in window 1osascript -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建议的语法)