【问题标题】:Bash Shell Scripting: what simple logic am I missingBash Shell 脚本:我缺少什么简单的逻辑
【发布时间】:2010-09-22 05:51:47
【问题描述】:

这可能是一个太笼统的问题,但是...... 试图从 shell 脚本中移动目录让我很难过。我不是 *nix 高级用户,但我很乐意通过命令行完成大多数任务。我想调用一个可以将“我”移动到目录的脚本,而不仅仅是类似于以下的脚本过程:

prompt:> goto lit   

goto 是一个别名 -> goto='./goscript'
并且
goscript 有一些简单的代码,例如:

cd /path to work dirs/lit/user dir  

(假设每个用户在 /lit 中都有一个目录)

我自己通过设置我的个人别名'移动到所需的目录,运行脚本,然后返回到原始目录来避免这个问题。这个问题是由一位使用类似方法的同事向我提出的,但他想让这个过程更加通用,这样我们就不需要创建我们需要的每一个别名。 我认为这将是一个很容易解决的问题,但我很难过,因为我真的没有大量的 shell 脚本编写经验......到目前为止。

【问题讨论】:

标签: linux bash shell pid


【解决方案1】:

比使用其他人描述的别名更好,检查CDPATH 变量!它基本上等同于 PATH 功能,但应用于 cd 命令。

例如,如果我将我的CDPATH 定义为$CDPATH:${HOME}/subdir,并且~/subdir 包含另一个目录subsubdir,那么我可以简单地执行:

cd subsubdir

从任何目录,并按预期导航路径。

这里有更多细节:

http://www.caliban.org/bash/#bashtips

要设置CDPATH 变量,请在您的.bashrc 中添加一行,例如

export CDPATH=$CDPATH:${HOME}/subdir

【讨论】:

  • +1 使用正确的工具来完成这项工作......我正试图教给我的孩子们,他们似乎认为一切都是一把锤子。
  • 另外,如果您重视自己的理智,请确保 CDPATH 值中的第一个字符是“:”,这样当您键入“cd bin”并且当前目录中有 bin 目录时,那就是你要去的地方。
【解决方案2】:

您可以创建一个名为 goto(或其他)的函数,并确保它已在您的 .bashrc 中定义(或者您可以从当前的 shell 中“获取”它):

function goto {
    #  the "$USER" part will expand to the current username
    # the "$1" will expand to the first argument to the function ("goto xyz" => $1 is "xyz")
    cd /some-path/lit/$USER/$1
}

将它放在 ~/.bashrc 或单独的文件中,然后从提示符中调用“source the-file”,然后您可以像调用任何其他程序一样调用该函数:

prompt> goto folder
 cd /some-path/lit/your-user/folder

【讨论】:

    【解决方案3】:

    要在提示符的相同环境中执行脚本,您必须使用 .

    调用它。

    假设您已命名脚本:

    cd .. 
    

    如果你用 .你得到:

    $> pwd
    $> /home/users/rd/proj
    $> . up
    $> pwd
    $> /home/users/rd
    

    【讨论】:

    • 点实际上相当于“source”命令。虽然至少在我的系统中我必须写“../up”而不是“.up”——否则我会得到错误:“bash: ELF: command not found”
    • 你说得对。您出现错误的原因是您没有 .在路径中。这是许多 unix shell 的默认行为(我一直不太了解其原因)。
    • @Remo.D:原因是安全性。它确保您不会意外地从当前目录执行命令而不是“真实”命令。想象在你的主目录中有一个名为 'ls' 的 shell 脚本,其内容是 'rm -rf /'
    【解决方案4】:

    你不能。该脚本有自己的环境副本,因此无法更改登录 shell 的环境。

    【讨论】:

      【解决方案5】:

      当我问这个问题时,我还不是会员(讽刺的是,我的匿名登录问题比我的官方登录问题的总和还要高),所以我现在无法关闭它 - 但是 - The Remo D. et al.答案将是导致我们需要的有效解决方案的答案。如果任何具有 mod 权力的人都可以关闭它并选择它作为接受的答案,我会认可它。

      【讨论】:

        【解决方案6】:

        您不能在 bash 脚本中使用 cd。不过,您可以为 cd 和路径设置别名。

        alias goto='cd /path_to_work/usr/dir'
        

        更新:您可以将该行放入 .bashrc 文件中,然后执行

        source ~/.bashrc
        

        创建别名。

        【讨论】:

          【解决方案7】:

          您可以使用别名来完成一些类似这样的简单事情。例如,我有一些别名将我放入工作空间环境并为我们的 Makefile 系统配置变量。这是我用作示例的真实别名。 '&&' 将继续执行命令,直到其中一个失败 - 在这样的简单场景中,不需要清理,因为不太可能失败。

          alias main1='cd ~/code/main1 && export TOP=`pwd` && export DEBUG=1'
          

          如果您想在同事之间开发一个共享别名库,您可以通过 NFS 共享它们并获取要包含的文件。

          【讨论】:

            【解决方案8】:

            每个脚本对当前工作目录都有自己的想法。 "cd" 不是一个进程,而是一个 shell 内置。

            做你想做的事的方法是创建一个别名。在 csh 中会是这样的:

            alias goto 'cd /path_to_work/\!*/user_dir'
            

            sh/bash 有类似的别名功能

            【讨论】:

              【解决方案9】:

              我的 .rc 中往往有几十个别名,如下所示:

              alias work='cd /home/foo/work'
              alias rails='cd /home/foo/rails'
              alias assets='cd /home/foo/rails/assets'
              

              等等

              如果这对您不起作用,您可以使用 bash 中的调试钩子在执行之前就地替换命令行 - 如果“goto”关键字是线。这将涉及在 bash 中搜索“陷阱”,但请注意,此类咒语在所有系统上的行为并不相同。几个月前我写过一篇这样的经历,欢迎大家the results

              【讨论】:

                猜你喜欢
                • 2014-01-28
                • 2017-09-30
                • 2018-08-10
                • 1970-01-01
                • 2014-01-14
                • 2013-04-06
                • 1970-01-01
                • 1970-01-01
                • 2011-09-10
                相关资源
                最近更新 更多