惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

M
MIT News - Artificial intelligence
罗磊的独立博客
Hugging Face - Blog
Hugging Face - Blog
J
Java Code Geeks
G
Google Developers Blog
美团技术团队
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
腾讯CDC
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
T
The Blog of Author Tim Ferriss
月光博客
月光博客
B
Blog
WordPress大学
WordPress大学
云风的 BLOG
云风的 BLOG
博客园_首页
人人都是产品经理
人人都是产品经理
aimingoo的专栏
aimingoo的专栏
Y
Y Combinator Blog
Jina AI
Jina AI
S
SegmentFault 最新的问题
H
Help Net Security
博客园 - 聂微东
Microsoft Azure Blog
Microsoft Azure Blog
Google DeepMind News
Google DeepMind News

博客园 - 夏之夜

Linux 学习笔记之(十四)二进制分析工具 GO 学习笔记之四 工具(1)远程调试工具 dlv Postgres 数据库(三)常见DDL命令 elasticsearch 学习笔记之五 备份还原开源方案比较 elasticsearch 学习笔记之四 快照 GO 学习笔记之一 环境安装 GO 学习笔记之零 (四)字符串处理集锦 GO 学习笔记之零 (三)常见问题处理集锦 GO 学习笔记之三 基础语法(5) 切片 GO 学习笔记之三 基础语法(12)文件操作 GO 学习笔记之五 编程(三)单元测试 ( VSCODE工具运行 ) GO 学习笔记之三 基础语法(11) 数据类型转换 GO 学习笔记之零 (二)git 操作(VSCODE) GO 学习笔记之零 (一)GO推荐的工程目录结构 Git 学习笔记之(六)windows 上 git 工具 安装 GO 学习笔记之二 常用命令集锦 elasticsearch 学习笔记之一 elasticdump elasticsearch 学习笔记之二 常见接口 专题(二十) cut
Shell命令集锦(一)
夏之夜 · 2025-08-14 · via 博客园 - 夏之夜

一、知识点

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 基本用法

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")。