6

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

prompt:> goto lit   

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

cd /path to work dirs/lit/user dir  

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

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

4

9 回答 9

9

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

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

cd subsubdir

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

这里有一些更具体的:

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

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

export CDPATH=$CDPATH:${HOME}/subdir
于 2008-11-13T21:20:18.507 回答
5

您可以创建一个名为 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
于 2008-11-13T21:11:09.650 回答
4

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

假设您已命名脚本:

cd .. 

如果你用 . 你得到:

$> pwd
$> /home/users/rd/proj
$> . up
$> pwd
$> /home/users/rd
于 2008-11-13T21:11:12.380 回答
2

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

于 2008-11-13T21:06:20.860 回答
1

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

于 2009-01-26T03:49:49.893 回答
0

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

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

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

source ~/.bashrc

创建别名。

于 2008-11-13T21:07:36.600 回答
0

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

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

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

于 2008-11-13T21:08:58.670 回答
0

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

做你想做的事情的方法是创建一个别名。在 csh 中,它将类似于:

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

sh/bash 有类似的别名功能

于 2008-11-13T21:09:57.653 回答
0

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

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

等等

如果这对您不起作用,您可以使用 bash 中的调试挂钩在执行之前就地替换命令行 - 如果“goto”关键字是该行的第一件事。这将涉及在 bash 中搜索“陷阱”,但请注意,此类咒语在所有系统上的行为都不相同。几个月前我写了一篇这样的经历,欢迎你来看看结果

于 2008-11-13T21:13:25.620 回答