Administrator
发布于 2026-03-19 / 15 阅读
0

cd切换目录

cd切换目录

常用:~(返回家目录), -(显示家目录), ..(返回上一级)
进阶:

  1. 物理路径 vs 逻辑路径:-P 和 -L

tm@server1:~$ mkdir a
tm@server1:~$ ln -s a b #软连接
tm@server1:~$ cd b #进入逻辑路径
tm@server1:~/b$ cd -P . #可以直接回到物理路径
tm@server1:~/a$

mkdir创建目录
2. 快速回到家目录的方法

tm@server1:~/a b$ cd
tm@server1:~$
tm@server1:~$ cd a\ b
tm@server1:~/a b$ cd ~
tm@server1:~$
tm@server1:~$ cd a\ b
tm@server1:~/a b$ cd $HOME #实用环境变量,这种主要是用于shell脚本
tm@server1:~$
  1. 快速进入其他用户家目录,需要有权限

tm@server1:~$ su -
Password:
root@server1:~# cd ~tm # 进入 tm 用户的家目录(如果有权限)
root@server1:/home/tm#

su切换用户
4. 进入带空格的目录,需要用引号或转义

tm@server1:~$ mkdir "a b"
tm@server1:~$ ls
 a  'a b'   b   file1   file2   file3.txt
tm@server1:~$ cd a b
-bash: cd: too many arguments
tm@server1:~$ cd a\ b #转义
tm@server1:~/a b$ 
tm@server1:~/a b$ cd
tm@server1:~$
tm@server1:~$ cd "a b" #引号
tm@server1:~/a b$
  1. 快速进入命令位置

tm@server1:~$ cd $(dirname $(which ls)) # 进入 ls 命令所在的目录(/usr/bin)
tm@server1:/usr/bin$
  1. $CDPATH变量,给目录起“快捷方式

tm@server1:~$ export CDPATH=.:/etc:/var
tm@server1:~$ cd tmp
/var/tmp
tm@server1:/var/tmp$ cd log
/var/log
tm@server1:/var/log$

# 清除变量的方式
tm@server1:~$ export CPPATH= #变量赋值为空
tm@server1:~$ unset CPPATH #删除变量
  1. $OLDPWD 变量,$OLDPWD 保存着上一个目录的路径

tm@server1:~$ cd /var/log/
tm@server1:/var/log$ cd /tmp/
tm@server1:/tmp$ echo "$OLDPWD"
/var/log
tm@server1:/tmp$ cd "$OLDPWD"
tm@server1:/var/log$

主要用处是在脚本中需要临时记住上一个目录,或者需要多次引用它。
8. 在脚本中安全使用 cd
脚本中使用 cd 时,务必检查是否成功,否则后续操作可能毁掉错误目录。

tm@server1:~$ ls
 a  'a b'   b   file1   file2   file3.txt
tm@server1:~$ ls a
b
tm@server1:~$ ls a/b
tm@server1:~$ 
tm@server1:~$ vim test.sh
tm@server1:~$ cat test.sh
#!/bin/bash

cd ~tm || { echo "目录不存在,退出" >&2; exit 1; }
cd a/b || { echo "目录不存在,退出" >&2; exit 1; }
cd a/b/c || { echo "目录不存在,退出" >&2; exit 1; }

tm@server1:~$
tm@server1:~$ ls -l
total 12
drwxrwxr-x 3 tm tm 4096 Mar 17 17:46  a
drwxrwxr-x 2 tm tm 4096 Mar 19 09:41 'a b'
lrwxrwxrwx 1 tm tm    1 Mar 17 17:35  b -> a
-rw-rw-r-- 2 tm tm    0 Mar 17 17:44  file1
-rw-rw-r-- 2 tm tm    0 Mar 17 17:44  file2
-rw-rw-r-- 1 tm tm    0 Mar 17 20:09  file3.txt
-rw-rw-r-- 1 tm tm  193 Mar 19 10:54  test.sh
tm@server1:~$ chmod +x test.sh
tm@server1:~$ ls -l
total 12
drwxrwxr-x 3 tm tm 4096 Mar 17 17:46  a
drwxrwxr-x 2 tm tm 4096 Mar 19 09:41 'a b'
lrwxrwxrwx 1 tm tm    1 Mar 17 17:35  b -> a
-rw-rw-r-- 2 tm tm    0 Mar 17 17:44  file1
-rw-rw-r-- 2 tm tm    0 Mar 17 17:44  file2
-rw-rw-r-- 1 tm tm    0 Mar 17 20:09  file3.txt
-rwxrwxr-x 1 tm tm  193 Mar 19 10:54  test.sh
tm@server1:~$ bash test.sh
test.sh: line 5: cd: a/b/c: No such file or directory
目录不存在,退出
tm@server1:~$
  1. 开启 shopt -s autocd:输入目录名直接切换

tm@server1:~$ shopt -s autocd
tm@server1:~$ /var/log # 自动执行 cd /var/log
cd -- /var/log
tm@server1:/var/log$
tm@server1:~$ shopt -u autocd

shopt开关启bash功能

tm@server1:~$ shopt #列出所有开关及其状态
autocd          off
assoc_expand_once       off
tm@server1:~$ shopt -p #以可重用的格式显示
shopt -u autocd
shopt -u assoc_expand_once
tm@server1:~$ shopt -s autocd # -s 表示 set(开启)
tm@server1:~$ shopt -u autocd # -u 表示 unset(关闭)

注意:这会与命令名冲突,建议只在交互式 shell 中临时使用。
9. 目录堆
同时处理多个项目时(比如配置文件在 /etc/nginx,日志在 /var/log/nginx,代码在 ~/project),用 pushd 依次进入,然后 popd 优雅返回,比反复 cd 更高效。(应该主要是用于shell脚本等位置)

命令

作用

dirs

显示当前目录栈(用空格分隔)

dirs -v

显示带编号的目录栈(编号从0开始)

pushd 目录

将当前目录压入栈,并切换到指定目录

pushd +N

旋转栈,将第N个目录移到栈顶并切换过去

popd

弹出栈顶目录,并切换到新的栈顶

popd +N

弹出第N个目录(不移到栈顶),但不会切换

tm@server1:~$ dirs -v
 0  ~
tm@server1:~$ pushd /etc/
/etc ~
tm@server1:/etc$ pushd /var/log/
/var/log /etc ~
tm@server1:/var/log$ pushd /tmp/
/tmp /var/log /etc ~
tm@server1:/tmp$ dirs -v
 0  /tmp
 1  /var/log
 2  /etc
 3  ~
tm@server1:/tmp$ pushd +1
/var/log /etc ~ /tmp
tm@server1:/var/log$ popd
/etc ~ /tmp
tm@server1:/etc$ popd
~ /tmp
tm@server1:~$ popd
/tmp
tm@server1:/tmp$ popd
bash: popd: directory stack empty