【问题标题】:Easy exercise on bash scripting简单练习 bash 脚本
【发布时间】: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 脚本。如果您编写函数而不是脚本(根据练习说明),那么它会正常工作。

标签: bash shell scripting


【解决方案1】:

ma​​rco.sh 可以是一个函数:

function marco(){
currentDirectory=$(pwd)

echo "Current directory is $currentDirectory"
echo "$currentDirectory" > /tmp/missing/marcoDirectory.txt
}

然后你可以source marco.sh 并运行marco.sh

polo.sh 可能是这样的:

function polo(){
    next=$(cat /tmp/missing/marcoDirectory.txt)
    echo "Changing directory to $next"
    cd "$next"
}

然后它应该重定向到 marco 目录。 请注意,next 变量应该有“”。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-03
    相关资源
    最近更新 更多