Shell命令集锦(一)

一、知识点

1、获取当前目录名称

    basename  命令获取

#!/bin/bash

CURRENT=`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.sh

output=`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")。

 

posted @ 2025-08-14 15:11  夏之夜  阅读(63)  评论(0)    收藏  举报