一、知识点
1、获取当前目录名称
basename 命令获取
#!/bin/bashCURRENT=`pwd`BASENAME=`basename "$CURRENT"`echo "$BASENAME"exit;
2、source
source(或等效的.命令)会直接在当前 Shell 会话中执行指定的脚本文件(这里是/etc/profile),而不是启动子进程。- 这意味着脚本中定义的 环境变量、别名、函数等会立即生效,无需重启终端或会话。
2.1 用法
1)直接在 shell 会话中 执行 source /etc/profile, 当前会话中加载生效 /etc/profile定义的全局变量
2)在一个脚本(test.sh)中通过 source xxx.sh 中加载xxx.sh 内容到 test.sh 脚本会话上,此时 test.sh 中可以直接调用 xxx.sh 上定义的方法或变量
xxx.sh 脚本内容如下
function hello(){echo "hello" }
test.sh 脚本内容可以如下:
source xxx.shoutput=`hello` echo $output
直接执行在 xxx.sh 脚本中的hello方法,打印输出内容
3、command
在 Shell 中,command 是一个内置命令,主要用于 绕过 Shell 的别名和函数查找机制,直接调用系统命令或显示命令的真实路径。
3.1 基本用法
command [-pVv] [command_name] [args...]
command_name:要执行的命令或程序名称。args:传递给命令的参数。
3.2 选项
| 选项 | 作用 |
|---|---|
-p |
使用系统的默认 $PATH(通常是 /bin:/usr/bin 等)搜索命令,忽略用户自定义路径。 |
-v |
显示命令的路径或定义(如果是别名/函数)。 |
-V |
更详细的描述(如命令类型:内置、别名、函数等)。 |
3.3 实操
(1) 绕过别名或函数
若用户定义了别名或函数,command 会直接调用原始命令:
# 示例:假设 ls 被别名化为 'ls --color=auto' alias ls='ls --color=auto'# 使用 command 调用原始 ls command ls # 无颜色输出
(2) 检查命令是否存在或获取路径
# 获取 python 的真实路径(忽略别名) command -v python # 输出示例:/usr/bin/python# 使用系统默认 PATH 搜索 command -pv python
(3) 强制调用系统命令
即使同名函数存在,也能执行系统命令:
# 定义了一个 echo 函数 echo() { printf "Hook: %s\n" "$*"; }# 调用系统原生的 echo command echo "Hello" # 输出: Hello
(4) 安全脚本编写
在脚本中避免因用户自定义别名/函数导致意外行为:
#!/bin/bash # 确保使用系统的 rm,而非用户可能定义的别名 command rm -rf "$temp_dir"
3.4 与其他命令对比
| 命令 | 特点 |
|---|---|
which |
仅查找可执行文件路径,可能受 $PATH 影响,不处理 Shell 内置命令。 |
type |
Shell 内置,可识别别名/函数/内置命令(类似 command -V)。 |
whereis |
查找二进制、源码和手册页,范围更广但不够精准。 |
4、realpath
realpath 是 Linux/Unix 系统中用于 解析文件或目录的绝对路径 的命令,它会去除路径中的符号链接(软链接)、相对路径(如 . 或 ..)等,返回标准化后的完整路径。
4.1 基本用法
realpath [选项] [文件或目录...]
4.2 选项
| 选项 | 作用 |
|---|---|
-e 或 --canonicalize-existing |
仅解析已存在的路径(默认行为)。 |
-m 或 --canonicalize-missing |
解析路径,即使文件/目录不存在。 |
-s 或 --no-symlinks |
不解析符号链接(保留原始链接路径)。 |
-q 或 --quiet |
静默模式,不显示错误信息(如路径不存在)。 |
--relative-to=DIR |
返回相对于指定目录的路径(而非绝对路径)。 |
--relative-base=DIR |
仅当路径在基准目录下时,返回相对路径,否则返回绝对路径。 |
4.3 实操
(1)获取文件的绝对路径
$ realpath file.txt
/home/user/file.txt
(2)解析符号链接的真实路径
$ ln -s /var/log logs # 创建软链接 $ realpath logs /var/log # 返回链接指向的真实路径
(3)处理相对路径
$ realpath ../parent_dir
/home/user/parent_dir # 解析父目录的绝对路径
(4)检查不存在的路径(使用 -m)
$ realpath -m /nonexistent/path
/nonexistent/path # 即使路径不存在也返回标准化结果
(5)返回相对路径
$ realpath --relative-to=/home/user /home/user/docs/file.txt
docs/file.txt # 相对于指定目录的路径
(6)批量解析路径
$ realpath dir1/file1 dir2/file2 # 同时解析多个路径
(7)忽略符号链接
$ realpath -s /usr/bin/python # 输出原始路径(如 /usr/bin/python3.8),不跟踪链接
4.4 与其他命令对比
| 命令 | 特点 |
|---|---|
readlink -f |
类似 realpath -e,但非 POSIX 标准,部分系统可能不支持。 |
pwd |
仅显示当前目录的绝对路径,不处理参数。 |
cd + pwd |
通过切换目录获取路径,但会改变环境(脚本中不推荐)。 |
4.5 注意事项
- 依赖安装:部分旧系统可能未预装
realpath,需手动安装(如coreutils包)。 - 符号链接循环:若路径中存在循环链接,
realpath会报错。 - 空格处理:路径含空格时建议用引号包裹(如
realpath "my file.txt")。
