Bash Shell脚本编程:我错过了哪些简单逻辑?

6

这可能是一个过于笼统的问题,但是... 我在尝试从shell脚本中遍历目录时感到困惑。我不是*nix高级用户,但对大多数任务通过命令行进行操作还是比较熟悉的。我想调用一个脚本,可以将“我”移动到目录中,而不仅仅是脚本进程,类似于以下内容:

prompt:> goto lit   

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

cd /path to work dirs/lit/user dir  

(假设每个用户在 /lit 目录下都有一个目录)
我通过将个人别名设置为移动到所需目录、运行脚本,然后返回原始目录来避免了这个问题。这个问题是由我的一位同事提出的,他使用类似的方法,但希望使该过程更加通用,以便我们不需要创建每个所需的别名。
我认为这应该是一个容易解决的问题,但我被卡住了,因为我没有太多的 shell 脚本经验...至少目前还没有。

请参考以下链接:https://dev59.com/LnVC5IYBdhLWcg3wjx5d - S.Lott
9个回答

9

除了其他人所描述的使用别名更好之外,还可以查看CDPATH变量!它基本上相当于PATH功能,但应用于cd命令。

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

cd subsubdir

从任何目录开始,按预期导航到路径。

以下是更具体的内容:

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

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

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

使用正确的工具来完成任务是非常重要的,这是我试图教给我的孩子们的一件事情。他们似乎认为“万物皆可用锤子敲打”。 - Adam Liss
此外,如果您珍视自己的理智,请确保 CDPATH 的值中第一个字符为 ':',这样当您键入 'cd bin' 且当前目录中存在 bin 目录时,您将进入该目录。 - Jonathan Leffler

5
你可以创建一个名为goto(或其他名称)的函数,并确保它在你的.bashrc文件中定义(或者你可以从当前shell“source”它):
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

4

要在与提示符相同的环境中执行脚本,您必须使用"."来调用它。

假设您有一个名为up的脚本:

cd .. 

如果您使用 . 调用它,您将得到以下结果:
$> pwd
$> /home/users/rd/proj
$> . up
$> pwd
$> /home/users/rd

点号实际上相当于“source”命令。尽管在我的系统中,我必须写成“. ./up”,而不是只写“. up” - 否则我会得到错误提示:“bash:ELF:找不到命令”。 - Rene Saarsoo
你说得对,问题出在源代码上。你遇到错误的原因是路径中没有“.”。这是许多Unix shell的默认行为(我从未完全理解其原因)。 - Remo.D
@Remo.D:原因是安全性。这可以确保您不会意外地从当前目录而不是“真正”的命令执行命令。想象一下,在您的主目录中有一个名为“ls”的shell脚本,其内容为“rm -rf /”。 - Adam Liss

2

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


1

当我提出这个问题时,我还不是会员(具有讽刺意味的是,我的匿名登录问题比我的官方登录问题的声望更高),所以现在无法关闭它。但是Remo D.等人的答案是导致我们需要的工作解决方案的答案。如果有任何拥有管理权限的人可以关闭此问题并选择该答案作为被接受的答案,我将不胜感激。


0

在Bash脚本中不能使用cd命令。但你可以为cd和路径设置别名。

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

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

source ~/.bashrc

创建别名。


0
每个脚本都有自己的当前工作目录概念。 "cd" 不是一个进程,而是一个 shell 内置命令。
实现你想要的方式是创建一个别名。在 csh 中,它将类似于:
alias goto 'cd /path_to_work/\!*/user_dir'

sh/bash 具有类似的别名功能


0

我在我的 .rc 文件中经常有几十个别名,看起来像这样:

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

如果这对你不起作用,你可能可以使用bash中的调试钩子,在执行命令行之前将其原地替换 - 如果“goto”关键字是该行的第一件事。这将涉及在bash中搜索“trap”,但要预先警告,这些咒语在所有系统上的行为都不相同。几个月前,我写了一个这样的经历,你可以查看结果


0

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

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接