在 sshfs 之后似乎没有考虑 Makefile 中的 cd

JKH*_*KHA 5 linux bash command-line sshfs makefile

我有一个 Makefile,其中包含一个sshfs命令,后跟一个cd命令:

mr: # mount-remote
        sshfs -p 5022 -o nonempty myname@myssh.serveur.fr:mnt /home/julien/myworking_path
        cd ./working_directory_mwe1/wk_subd_mwe2/
Run Code Online (Sandbox Code Playgroud)

第一个命令 sshfs 就像一个魅力一样,可以正确安装两个端点。但是,cd 命令不会更改目录。然后我必须手动重新输入。如果我手动输入,它就可以工作,但我希望在输入命令时完成mr

我尝试了以下操作,但记住这可能是因为我在执行时连接了终端 2 秒,sshfs但这也不起作用。我尝试cd每秒重新运行一次,直到它起作用。

mr: # mount-remote
        sshfs -p 5022 -o nonempty myname@myssh.serveur.fr:mnt /home/julien/myworking_path
        until cd ./working_directory_mwe1/wk_subd_mwe2/ ; do sleep 1 ; done
Run Code Online (Sandbox Code Playgroud)

感谢您的热心帮助 :)

编辑:我忘记指定我尝试的最小工作目录cd正是端点处的目录,实际上,我意识到我的目标是:

mr: # mount-remote
        sshfs -p 5022 -o nonempty myname@myssh.serveur.fr:mnt /home/julien/myworking_path
        cd /home/julien/myworking_path/some_sub_dir1/som_sub_dir2
Run Code Online (Sandbox Code Playgroud)

use*_*686 17

\n

但是,cd 命令不会更改目录。

\n
\n

它确实 \xe2\x80\x93 但它只影响由 \'make\' 生成的临时 shell 子进程,而不影响它们上面的交互式 shell。

\n

“当前目录”不是终端范围的参数 \xe2\x80\x93每个进程都有自己的当前目录,子进程中对其进行的更改永远不会向上传播(它们只能由更改后创建的新进程向下继承)。

\n
xterm\n \xe2\x94\x94\xe2\x94\x80 bash (interactive)\n     \xe2\x94\x94\xe2\x94\x80 make mr\n         \xe2\x94\x9c\xe2\x94\x80 /bin/sh -c "sshfs -p ..."\n         \xe2\x94\x82   \xe2\x94\x94\xe2\x94\x80 sshfs -p ...\n         \xe2\x94\x94\xe2\x94\x80 /bin/sh -c "cd ..."\n
Run Code Online (Sandbox Code Playgroud)\n

这意味着退出后,您在 Makefile 中执行的任何操作都不会直接影响父 shell make,这同样适用于用任何其他语言编写的脚本。(环境变量也以同样的方式工作。)

\n

实现此功能的唯一方法是将mr(即单独的“mr”,不再是“make mr”)转换为 shell别名或 shell函数\xe2\x80\x93,这两者都在 shell 内部执行。

\n

~/.bashrc函数可以在您的或中定义~/.zshrc

\n
mr() {\n    sshfs foo:mnt ~/working_path\n    cd ~/working_path/something\n}\n
Run Code Online (Sandbox Code Playgroud)\n

请注意,调用 shell 函数时不必键入括号,只需在定义它们时键入括号即可。一旦定义,它们的行为就像常规命令一样,并且只是作为mr. (另请参阅定义它们的其他方法。)

\n

如果函数足够短且简单(特别是,如果不需要通过 $1 等接受参数),那么它可以是一个别名,而不是 \xe2\x80\x93 别名能够将当前目录更改为出色地:

\n
alias mr=\'sshfs foo:mnt ~/working_path && cd ~/working_path/something\'\n
Run Code Online (Sandbox Code Playgroud)\n
\n
\n

最重要的是,常规 make 在单独的shell 子进程中运行每一行,因此同一 Make 配方中的其他命令也不会受到影响。

\n

如果您希望cd影响 Make 配方,则需要使用\\延续将所有配方行连接到单个“逻辑行”中,如下所示:

\n
mr:\n    sshfs foo:mnt ~/myworking_path\n    cd ./working_directory_mwe1/wk_subd_mwe2/ && \\\n        pwd && ls && echo "This happens in the new directory..."\n    pwd && ls && echo "...this is back in the old one."\n
Run Code Online (Sandbox Code Playgroud)\n

...或使用 GNU Make 特定的.ONESHELL:特殊目标:

\n
.ONESHELL:\n\nmr:\n    sshfs foo:mnt ~/myworking_path\n    cd ./working_directory_mwe1/wk_subd_mwe2/\n    pwd; ls; echo "This time the directory change did carry over."\n
Run Code Online (Sandbox Code Playgroud)\n