如何在Bash脚本中使用cd命令
1. 概述
为方便起见,我们可能想要运行一个 shell 脚本来更改我们当前所在的文件夹。例如,如果我们经常访问*/var/log*文件夹并想要快速导航到那里,我们可以创建一个 Bash 脚本来执行此操作.
在本教程中,我们将了解如何使用cd 命令来完成此操作。在此过程中,我们将看到cd行为方式的一些复杂性。
2. 一个常见问题
让我们从一个脚本开始,该脚本首先导航到 /var/log目录。我们称之为 varlog.sh:
#!/usr/bin/env bash
# Filename: varlog.sh
cd /var/log
pwd
echo $$
这里的想法是我们导航到*/var/log*,显示当前文件夹以验证它是否已更改,最后显示它正在运行的 shell 的进程 ID。 但是,让我们了解运行varlog.sh时的主要限制:
$ ./varlog.sh
/var/log
29903
正如我们所看到的,运行我们的脚本会按预期为我们提供*/var/log*的输出以及 shell 的进程 ID。
现在,让我们看看执行脚本后,我们当前在哪个文件夹中:
$ pwd
/home/blogdemo
这不是我们所期望的,因为**当前文件夹没有更改为*/var/log*。**那么,为什么会这样呢?
让我们检查一下我们的 shell 进程 ID:
$ echo $$
28285
我们可以看到我们所在的shell的进程ID(PID 28285)和shell脚本的进程ID(PID 29903)是不同的。
这意味着 Bash 脚本在单独的独立 shell 中运行。这个单独的 shell 在脚本结束时终止,而父 shell,即我们所在的 shell,不受影响。
在接下来的部分中,我们将看到几种解决这个问题的方法。
3. 在同一进程中运行 Bash 脚本
要让脚本在与当前 shell 相同的进程中运行,我们可以使用*source * 命令。这个内置命令也有一个使用. (点)。
首先,让我们检查一下source 命令的帮助:
$ source --help
source: source filename [arguments]
Execute commands from a file <strong>in the current shell</strong>.
....
伟大的!所以我们可以在当前进程中运行一个 Bash 脚本,而不需要启动一个单独的 Bash 进程。
让我们试试:
$ source varlog.sh
/var/log
28285
我们还要验证我们所在的文件夹现在是否已更改:
$ pwd
/var/log
好的!所以我们已经演示了使用source,我们可以在当前 shell 中执行 shell 脚本。 或者,我们可以使用短格式符号:
$ . varlog.sh
/var/log
28285
注意:如果 Bash 脚本旨在获取而不是执行。最好用*# This file should be sourced* 之类的注释来表示。
4. Bash 函数
为每个文件夹创建一个Bash脚本很痛苦。相反,我们可以在一个脚本中编写多个Bash函数 :
# Filename: folders.sh
# This file should be sourced
function varlog() {
cd "/var/log"
}
function tmp() {
cd "/tmp"
}
现在,如果我们获取文件:
$ source folders.sh
我们可以在当前终端中使用该脚本中的函数:
$ tmp
$ pwd
/tmp
$ varlog
$ pwd
/var/log
5. alias
我们可以通过使用alias 命令进一步改进我们的 Bash 函数。alias比函数更方便使用,因为它通常需要更少的输入。 让我们尝试将我们的函数转换为它们的alias变体:
# Filename: folders.sh
# This file should be sourced
alias varlog="cd /var/log"
alias tmp="cd /tmp"
与我们之前编写的 bash 函数相比,我们可以看到这是多么简洁。除此之外,我们可以像使用函数一样使用别名:
$ unset -f varlog
$ unset -f tmp
$ source folders.sh
$ varlog
$ pwd
/var/log
$ tmp
$ pwd
/tmp
在这一系列命令中,我们使用*unset * 从环境中删除了函数,并将它们替换为等效的alias。这是通过在包含别名的folders.sh上使用源来实现的。
为方便起见,我们还可以在*.bash_profile中执行source* folder.sh。这将允许别名在我们的会话中持续存在。
6. 使用z实用程序
z是一个实用程序,用于记录最近经常访问的文件夹。我们可以依靠z自动为我们完成工作,而不是创建 Bash 脚本。
由于z没有预装 Linux,我们需要安装它。要安装z 下载 它,然后在我们的*.bashrc*文件中获取它:
source <location of z>/z.sh
为了尝试这个,让我们开始使用cd浏览不同的文件夹:
$ cd ~/Downloads
$ cd ~/Music
$ cd /var/log
$ cd ~
$ z
29859 /home/user/Music
29868 /var/log
59694 /home/user/Downloads
请注意在调用z之后我们如何获得我们访问过的文件夹列表。要转到特定文件夹而无需输入完整路径,让我们尝试使用z而不是cd。
$ cd ~
$ z log
$ pwd
/var/log
我们可以看到导航到特定位置要快得多,因为不需要输入整个路径。通过输入z log, z能够cd进入*/var/log*。这是因为这是最常访问的目录匹配log。