【发布时间】:2020-09-24 02:21:20
【问题描述】:
我目前正在做MIT missing semester lecture 2。
练习 2 让我们将函数 marco.sh 和 polo.sh 写入“polo”返回执行 marco 的目录。我为此写了两个简单的脚本,但是 polo.sh 并没有将cd 放入我保存的目录中。
马可
#!/bin/bash
currentDirectory=$(pwd)
echo "current directory is $currentDirectory"
echo "$currentDirectory" > /tmp/missing/marcoDirectory.txt
(必须将目录保存在 .txt 文件中,因为 bash 无法识别带有 polo 的 currentDirectory 变量。同样,这是一个练习,我对此并不感到非常自豪)
马球
#!/bin/bash
next=$(cat /tmp/missing/marcoDirectory.txt)
echo "changing directory to $next"
cd $next
事实上,cd 命令似乎并没有意识到它必须被执行。如果我尝试在其他地方cd,它也会失败。
我应该如何解决cd 问题?
【问题讨论】:
-
如何发现切换到目录不起作用?您是否假设脚本结束时您将在
$next目录中? -
是的,我假设我的终端窗口最后会位于
$next。我发现它不起作用,因为在运行它们之后我仍然在同一个目录中。例如,如果我在 /sodium/lithium,我可以运行 marco.sh 并将其保存在 .txt 文件中。然后,假设我 cd 到 /carbon/nitrogen。如果我运行 polo.sh,它会回显“将目录更改为 /sodium/lithium”,但保持在 /carbon/nitrogen。 -
脚本通常在子进程中运行,这意味着更改目录(和设置变量)会更改子进程的状态,但对父进程没有影响。要影响父进程,您需要类似函数(不是脚本),或者使用
.或source运行的脚本而不是普通脚本。见:"Change the current directory from a Bash script" -
polo 总是从
/tmp/missing运行?为确保 polo 能够正常工作,您应该cat /tmp/missing/marcoDirectory.txt。 -
您不是在编写 bash 函数。您正在编写 bash 脚本。如果您编写函数而不是脚本(根据练习说明),那么它会正常工作。