Macos 在shell脚本中调用cd
我有一个shell脚本打开一个perl脚本。这个perl脚本应该在终端中打开。我可以打开终端,但无法调用cd以到达perl脚本的位置Macos 在shell脚本中调用cd,macos,bash,terminal,applescript,Macos,Bash,Terminal,Applescript,我有一个shell脚本打开一个perl脚本。这个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
$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\u DIR
包含路径,我通过将路径写入文件来验证这一点。最终,命令cd$PROJECT\u DIR
不起作用。不在变量的内容上执行cd
PS:这是在带有bashshell的mac上,在这种情况下不需要cd;把你的两个电话合起来就行了
在窗口1中编写脚本“$PROJECT_DIR/ls”每个脚本都作为自己的进程运行,执行自己的操作,然后退出。脚本的状态(包括环境变量及其当前目录定义)在退出时会被丢弃——因此您不能期望只执行“cd”的脚本在以后仍然有效 如果你做了这样的事情:
do script "cd $PROJECT_DIR; ls; ./runTests.pl"
…然后这将在一个shell中执行所有三个命令,结果将是您所期望的。环境变量也特定于每个进程 使用单引号字符串调用
osascript
的方式告诉bash的原始实例不要替换变量名。它实际上将“cd$PROJECT\u DIR”
发送到osascript
,后者将cd$PROJECT\u DIR
发送到终端
但是,$PROJECT\u DIR
未在接收bash进程中设置–在终端窗口中运行的进程。您可以通过在窗口1中添加一行,如do script“set”,或在窗口1中添加do script“echo$PROJECT\u DIR”,来验证这一点
如果用双引号将脚本的变量名部分括起来,则原始bash进程将替换$PROJECT_DIR的值:
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'
(CharlesDuffy建议的语法)ls
是一个系统命令,可能会偏离路径,而不是$PROJECT_DIR
中的某个命令;但是,它会根据当前目录改变行为(在没有参数的情况下调用),因此首先调用cd
(或传递参数)很重要。我猜这张海报的意思是do script“$PROJECT\u DIR/RunTests.pl”
@Charles Duffy。。它没有做一张cd上的$PROJECT_DIR内容,请看下面的输出。。。PHCCWFGML003:~macadmin$pwd/Users/macadmin PHCCWFGML003:~macadmin$cd$PROJECT\u让我再解释一遍——它确实做cd,但做cd的过程立即退出;您的下一个命令,即ls
(或pwd
)将在新的shell中运行,这与执行cd
的shell不同,并且不会从其效果中获益。。。但是,仅仅因为新shell没有从旧shell制作的cd
中受益,并不意味着它没有发生。@Charles Duffy请看一看我刚才添加的快照,您能解释一下您到底想要完成什么吗?$PROJECT_DIR=“/Users/macadmin/Documents/”尝试在$PROJECT_DIR变量上制作一张cd,该变量包含上述内容。根据随后的屏幕截图和我自己的测试,显然这不是确切的问题。窗口1中的效果是osascript
实际上按顺序将这四个命令发送到同一终端窗口中运行的同一个shell。要处理cd
失败的可能性,最好编写do脚本“cd$PROJECT_DIR&&{ls;/runTests.pl;}”
,不幸的是,这没有帮助:cd
无论是否设置了$PROJECT\u DIR
,都是成功的。@learningDroid另一种方法是将其保留为单引号,但仅在变量解引用周围更改为双引号。。。因此,除了将$PROJECT\u DIR
更改为'“$PROJECT\u DIR”
之外,请按原样使用原始代码;就我个人而言,我觉得这比增加一堆额外的逃逸要干净一些。