【问题标题】:Shell Script that goes up N folders in the file system在文件系统中上升和文件夹的 Shell 脚本
【发布时间】:2014-03-06 00:15:54
【问题描述】:

我刚刚在 SO 上发现 this 非常有用的 shell 脚本,但不幸的是它不适用于 Mac OS X 10.5。

这是有问题的脚本(为方便起见,复制了它):

#!/bin/bash
LIMIT=$1
P=$PWD
for ((i=1; i <= LIMIT; i++))
do
    P=$P/..
done
cd $P

我在最后尝试了echo $P,它返回了正确的路径,但cd $P 似乎仍然不起作用。

所以我尝试在终端中手动输入P="some/path"cd $P 并且成功了。

我不明白为什么相同的命令在脚本中不起作用。会不会是安全问题?

有什么建议吗?

【问题讨论】:

    标签: macos bash shell


    【解决方案1】:

    我在 Linux 上也遇到过同样的问题,实际上,如果我在搜索后正确理解了我发现的内容,就会发生这种情况:

    该命令在子 shell 中启动,并且在该子 shell 中路径发生更改,您看不到更改,因为当脚本完成时,您会返回到起始(父)shell。

    我通过将那个有用的脚本作为一个函数放在我的 .bashrc 中解决了这个问题,如下所示:

    up(){
        #code goes here
    }
    

    另一种选择是每次启动时获取脚本,但我更喜欢第一个。

    【讨论】:

    • 这看起来很有希望,但是您知道 .bashrc 的 mac 等效项是什么吗(我的主目录中不存在 .bashrc)?我什至不知道mac标准shell是什么:-(
    • 如果您没有 .bashrc,您可以随时创建或编辑 .bash_profile
    • 你有 ~/.bash_profile 还是 ~/.profile?如果是,您可以使用它们。如果你只写 bash 并在命令提示符下按回车会发生什么?
    • 我创建了 .bashrc,在控制台中输入 bash 后它就可以工作了。但是,如果它也可以在标准终端中使用会更好。
    • 在 OS X 终端中默认不运行 .bashrc 的原因可能是因为您的终端将 shell 作为登录 shell 打开。 Bash 将 shell 区分为登录 / 或非登录 shell,以及交互式或非交互式 shell,这取决于它的启动方式,这会影响它将运行的启动文件的顺序和名称。详细信息在 bash 手册页中,但粗略地说,“profile”是为登录 shell 运行的,“.bashrc”是为交互式非登录 shell 运行的。
    【解决方案2】:

    一旦 shell 脚本结束,它会让你回到执行它的目录。 cd 只会影响脚本进程的 cwd

    【讨论】:

      【解决方案3】:

      您只是更改了作为解释器运行脚本的 shell 副本的工作目录,而不是您启动脚本的原始 shell 程序。

      对于类似 bash 的 shell,为了运行在交互式 shell 会话上运行的一系列命令,您可以将它们定义为 shell 函数。

      例如输入以下内容

      up() { LIMIT=$1; P=$PWD; for ((i=1; i <= LIMIT; i++)); do P=$P/..; done; cd $P; }
      

      然后您将定义一个 up 命令,按照您的预期工作。

      您可以将此函数定义放入登录时获取的文件中,例如 .bashrc,以便在登录时方便地定义它。

      【讨论】:

        【解决方案4】:

        如果您想在当前 shell 的上下文中运行脚本,只需执行以下操作之一(假设您的 shell 脚本名为 cdup)

        . cdup 3 
        source cdup 3
        

        源命令(及其别名 .)在当前 shell 的上下文中运行提供的脚本,即它们不会启动单独的子 shell 来运行命令,因此您的 cd 将像在当前 shell 中一样工作

        【讨论】:

          【解决方案5】:

          对 up() 函数的一个小补充;添加没有值的测试:

          限额=$1
          如果 [ -z "$LIMIT" ];然后
          限制=1

          没有更多的“cd ..” - 只是“向上”

          【讨论】:

            猜你喜欢
            • 2014-05-08
            • 1970-01-01
            • 1970-01-01
            • 2013-08-18
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-07-15
            相关资源
            最近更新 更多