Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macos 在shell脚本中调用cd_Macos_Bash_Terminal_Applescript - Fatal编程技术网

Macos 在shell脚本中调用cd

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

我有一个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 "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”
之外,请按原样使用原始代码;就我个人而言,我觉得这比增加一堆额外的逃逸要干净一些。