如何设置父进程的工作目录?

2024-10-11 08:36:00
admin
原创
77
摘要:问题描述:正如标题所示,我们正在编写一个 Unix 风格的 shell 实用程序U,它应该(在大多数情况下)从 bash 调用。您究竟如何才能改变 bash 的工作目录(或者一般来说是父目录)?PS:shell 实用程序chdir成功完成了完全相同的操作,因此必须有一种编程方式来实现该效果。解决方案 1:不要...

问题描述:

正如标题所示,我们正在编写一个 Unix 风格的 shell 实用程序U,它应该(在大多数情况下)从 bash 调用。

究竟如何才能改变 bash 的工作目录(或者一般来说是父目录)?

PS:shell 实用程序chdir成功完成了完全相同的操作,因此必须有一种编程方式来实现该效果。


解决方案 1:

不要这样做。

FILE *p;
char cmd[32];
p = fopen("/tmp/gdb_cmds", "w");
fprintf(p, "call chdir("..")
detach
quit
");
fclose(p);
sprintf(cmd, "gdb -p %d -batch -x /tmp/gdb_cmds", getppid());
system(cmd);

可能会起作用,但请注意,Bash 的pwd命令已被缓存并且不会注意到。

解决方案 2:

除了要求父进程自己改变它之外,没有其他“合法”的方法来影响父进程的当前目录。

chdir在 Bash 脚本中改变目录的不是一个外部实用程序,而是一个内置命令。

解决方案 3:

chdir 命令是 shell 内置的,因此它可以直接访问执行它的 shell 的工作目录。shell 通常非常善于保护自己免受脚本的影响,为子进程提供shell 自己的工作环境的副本。当子进程退出时,它使用的环境将被删除。

您可以做的一件事是“获取”脚本。这可以让您更改目录,因为本质上,您是在告诉 shell 执行文件中的命令,就像您直接输入命令一样。也就是说,在获取脚本时,您不是在 shell 环境的副本上工作,而是直接在它上面工作。

解决方案 4:

我解决这个问题的方法是使用一个 shell 别名来调用该脚本并获取该脚本写入的文件。例如,

function waypoint {
    python "$WAYPOINT_DIRECTORY"/waypoint.py $@ &&
    source ~/.config/waypoint/scratch.sh
    cat /dev/null > ~/.config/waypoint/scratch.sh
}

waypoint.py创造scratch.sh出看起来像

cd /some/directory

这仍然是一件坏事。

解决方案 5:

你究竟如何才能改变 bash 的工作目录(或者一般来说是父目录)?

使用任何“可接受”的方式都不可能实现。所谓可接受,是指“无需粗暴地破解您的系统(例如使用gdb )” ;)

更严重的是,当用户启动可执行文件时,子进程将在其自己的环境中运行,该环境主要是其父环境的副本。此环境包含“环境变量”以及“当前工作目录”,仅举这两个例子。

当然,进程可以改变自己环境。例如,更改其工作目录(例如当您cd xxx在 shell 中时)。但由于此环境是副本因此不会以任何方式改变父级环境。并且没有标准方法来修改父级环境。


顺便提一下,这就是为什么cd("chdir") 是内部shell 命令,而不是外部实用程序。如果是这样的话,它将无法更改 shell 的工作目录。

解决方案 6:

你不能。就像在现实生活中你无法改变父母的道路一样:)

不过,还有一些类似的替代方案:

  1. 启动一个子 shell 并在那里更改目录(不会影响父级)。

  2. 附加到通常/dev/ttyX所在的某个控制台并在那里执行命令。X`S0`S63

  3. 向父进程发送一条包含要执行的命令的消息:

#include <sys/ioctl.h>

void inject_shell(const char* cmd){
  int i = 0;
  while (cmd[i] != ''){
    ioctl(0, TIOCSTI, &cmd[i++]);
  }
}

int main(void){
  inject_shell("cd /var
");
  return 0;
}

编译并运行:

$ gcc inject.c -o inject
$ ./inject
cd /var
/var $

当字符串以 结尾时,`
它可能会模仿按下Enter按键(回车键) - 这取决于你的 shell,这可能会起作用或尝试
`。这是一种作弊行为,因为命令是在完成你的进程后执行的,而你有点强迫用户执行一些命令。

解决方案 7:

如果你以交互方式运行 shell,并且目标目录是静态的,那么你可以简单地将别名放入~/.bashrc文件中:

alias cdfoo='cd theFooDir'

在处理非交互式 shell 脚本时,您可以在父 Bash 脚本和子 Bash 脚本之间创建协议。实现此协议的一种方法是让子脚本将路径保存到文件中(例如~/.new-work-dir)。子进程终止后,父进程将需要读取此文件(例如cd cat ~/.new-work-dir``)。

如果您打算经常使用上一段中提到的规则,我建议您下载 Bash 源代码并对其进行修补,以便它~/.new-work-dir在每次运行命令后自动将工作目录更改为内容。在补丁中,您甚至可以实现一个全新的 Bash 内置命令,该命令适合您的需求并实现您希望它实现的协议(这个新命令可能不会被 Bash 维护者接受)。但是,修补适用于个人使用和较小的社区使用。

解决方案 8:

我不知道这是否也是“不要这样做”......

感谢https://unix.stackexchange.com/questions/213799/can-bash-write-to-its-own-input-stream/中极其有用的讨论...

tailcd实用程序(“tail-call cd”)在 bash 和 Midnight Commander 中均可运行,允许在以下脚本中使用

/bin/mkcd:

mkdir "$1" && tailcd "$1"

实现起来很棘手,它需要xdotool命令tailcd必须是脚本中的最后一个命令(对于允许多种实现的实用程序来说,这是典型的兼容性要求)。它会破解 bash 输入流,也就是插入cd <dirname>到其中。在 Midnight Commander 的情况下,它还会插入两个 Ctrl+O(面板打开/关闭)键盘命令,并且以非常黑客的方式使用 sleep 进行进程间同步(这很可惜,但它确实有效)。

/bin/tailcd:

#! /bin/bash
escapedname=`sed 's/[^a-zA-Zd._/-]/\\&/g' <<< "$1"`
if [ -z "$MC_TMPDIR" ] ; then
xdotool type " cd $escapedname  "; xdotool key space Return
else
(sleep 0.1; xdotool type " cd $escapedname "; xdotool key space Return Ctrl+o; sleep 0.1; xdotool key Ctrl+o )&
fi

(之前的空格cd会阻止插入的命令进入历史记录;目录名后的空格是其工作所必需的,但我不知道为什么。)

的另一种实现tailcd不使用xdotool,但它不适用于 Midnight Commander:

#!/bin/bash
escapedname=`sed 's/[^a-zA-Zd._/-]/\\&/g' <<< "$1"`
perl -e 'ioctl(STDIN, 0x5412, $_) for split "", join " ", @ARGV' " cd" "$escapedname" $'
'

理想情况下,tailcd应该成为 bash 的一部分,使用正常的进程间通信等。

相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   601  
  华为IPD与传统研发模式的8大差异在快速变化的商业环境中,产品研发模式的选择直接决定了企业的市场响应速度和竞争力。华为作为全球领先的通信技术解决方案供应商,其成功在很大程度上得益于对产品研发模式的持续创新。华为引入并深度定制的集成产品开发(IPD)体系,相较于传统的研发模式,展现出了显著的差异和优势。本文将详细探讨华为...
IPD流程是谁发明的   7  
  如何通过IPD流程缩短产品上市时间?在快速变化的市场环境中,产品上市时间成为企业竞争力的关键因素之一。集成产品开发(IPD, Integrated Product Development)作为一种先进的产品研发管理方法,通过其结构化的流程设计和跨部门协作机制,显著缩短了产品上市时间,提高了市场响应速度。本文将深入探讨如...
华为IPD流程   9  
  在项目管理领域,IPD(Integrated Product Development,集成产品开发)流程图是连接创意、设计与市场成功的桥梁。它不仅是一个视觉工具,更是一种战略思维方式的体现,帮助团队高效协同,确保产品按时、按质、按量推向市场。尽管IPD流程图可能初看之下显得错综复杂,但只需掌握几个关键点,你便能轻松驾驭...
IPD开发流程管理   8  
  在项目管理领域,集成产品开发(IPD)流程被视为提升产品上市速度、增强团队协作与创新能力的重要工具。然而,尽管IPD流程拥有诸多优势,其实施过程中仍可能遭遇多种挑战,导致项目失败。本文旨在深入探讨八个常见的IPD流程失败原因,并提出相应的解决方法,以帮助项目管理者规避风险,确保项目成功。缺乏明确的项目目标与战略对齐IP...
IPD流程图   8  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用