我有一个带有sshfs
命令的 Makefile,后跟一个cd
命令:
mr: # mount-remote
sshfs -p 5022 -o nonempty [email protected]:mnt /home/julien/myworking_path
cd ./working_directory_mwe1/wk_subd_mwe2/
第一个命令, sshfs 就像一个魅力,并正确安装两个端点。但是,cd 命令不会更改目录。然后我必须手动重新输入。如果我手动输入,它就会工作,但我希望在输入mr
命令时完成。
我尝试了以下操作,但记住这可能是因为我的终端在执行时连接了 2 秒钟,sshfs
但这也不起作用。cd
我试图每秒重新运行一次,直到它起作用。
mr: # mount-remote
sshfs -p 5022 -o nonempty [email protected]:mnt /home/julien/myworking_path
until cd ./working_directory_mwe1/wk_subd_mwe2/ ; do sleep 1 ; done
谢谢你的热心帮助 :)
编辑:我忘了指定我尝试的最小工作目录cd
正是端点上的那个,实际上,我意识到我的目标是:
mr: # mount-remote
sshfs -p 5022 -o nonempty [email protected]:mnt /home/julien/myworking_path
cd /home/julien/myworking_path/some_sub_dir1/som_sub_dir2
确实如此——但它只影响由“make”生成的临时 shell 子进程,而不影响它们上面的交互式 shell。
“当前目录”不是终端范围的参数——每个进程都有自己的当前目录,并且子进程中对它的更改永远不会向上传播(它们只能被更改后创建的新进程向下继承)。
这意味着您在 Makefile 中所做的任何事情都不会在
make
退出后直接影响父 shell,这同样适用于以任何其他语言编写的脚本。(环境变量也以同样的方式工作。)完成这项工作的唯一方法是将
mr
(即单独的“mr”,不再是“make mr”)转换为 shell别名或 shell函数——这两者都在 shell 内部执行。函数可以在你的
~/.bashrc
or中定义~/.zshrc
:请注意,您不必在调用 shell 函数时键入括号,只需在定义它们时键入。一旦定义,它们的行为就像常规命令一样,并且被调用为
mr
. (另请参见定义它们的其他方法。)如果函数足够短和简单(特别是,如果不需要通过 $1 等接受参数),那么它可以是别名——别名也可以更改当前目录:
最重要的是,常规 make 在单独的shell 子进程中运行每一行,因此即使是同一 Make 配方中的其他命令也不受影响。
如果您希望
cd
影响 Make 配方,则需要使用\
延续将所有配方行加入单个“逻辑行”,如下所示:...或使用 GNU Make 特定的
.ONESHELL:
特殊目标: