与父 shell 具有不同 CWD 的 Bash 脚本?

与父 shell 具有不同 CWD 的 Bash 脚本?

我正在为我的计算机科学课做一个谜题,我需要/challenge/executable通过 shell 脚本从的 CWD执行二进制文件/tmp/exampledir,其中 shell 的 CWD 与 shell 脚本的目录不同,或者正如挑战所说的那样:

  • 挑战检查特定的父进程:shellscript
  • 挑战将检查它是否在特定的当前工作目录中运行:/tmp/exampledir
  • 挑战将检查以确保父级的父级 CWD 与挑战的 CWD 不同

我原本的理解是,/tmp/exampledir从不同的目录运行存储在 中的 shell 脚本,但 bash 脚本的 cwd 更改为我运行它的位置。我尝试将cd /tmp/exampledirbash 脚本放入并从另一个目录运行它,但当我运行它时,它显示 shell 脚本和父进程都在 的 CWD 中/tmp/exampledir。我这里是不是漏掉了什么?谢谢!

答案1

由于当前工作目录是从父进程继承的,因此您需要一些可以更改目录然后用所需命令替换自身的东西。为此,这应该有效:

sh -c 'cd /tmp/exampledir; exec /challenge/executable'

关键部分是exec,它用指定的命令替换 shell 进程。

例如,此脚本的行为应类似于挑战可执行文件:

#! /bin/bash

printf "My PWD is %q. The PWD of my parent process is %q.\n" "$PWD" "$(readlink /proc/$PPID/cwd)"

进而:

# ./foo.sh
My PWD is /home/muru. The PWD of my parent process is /home/muru.
# sh -c 'cd /tmp; exec /home/muru/foo.sh'
My PWD is /tmp. The PWD of my parent process is /home/muru.
# mkdir -p "foo bar"
# cd "foo bar"
# sh -c 'cd /tmp; exec /home/muru/foo.sh'
My PWD is /tmp. The PWD of my parent process is /home/muru/foo\ bar.

相关内容