我正在为我的计算机科学课做一个谜题,我需要/challenge/executable
通过 shell 脚本从的 CWD执行二进制文件/tmp/exampledir
,其中 shell 的 CWD 与 shell 脚本的目录不同,或者正如挑战所说的那样:
- 挑战检查特定的父进程:shellscript
- 挑战将检查它是否在特定的当前工作目录中运行:/tmp/exampledir
- 挑战将检查以确保父级的父级 CWD 与挑战的 CWD 不同
我原本的理解是,/tmp/exampledir
从不同的目录运行存储在 中的 shell 脚本,但 bash 脚本的 cwd 更改为我运行它的位置。我尝试将cd /tmp/exampledir
bash 脚本放入并从另一个目录运行它,但当我运行它时,它显示 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.