Linux命令--cd命令:切换目录

本文详细介绍了Linux系统中cd命令的使用方法,包括切换目录的基本语法、特殊符号的简化用法,以及绝对路径和相对路径的概念。通过实际示例,帮助初学者掌握cd命令的正确使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

3.3 cd命令:切换目录

 

cd 是切换所在目录的命令,这个命令的基本信息如下。

  • 命令名称:cd。
  • 英文原意:change directory。
  • 所在路径:Shell 内置命令。
  • 执行权限:所有用户。
  • 功能描述:切换所在目录。


Linux 的命令按照来源方式分为两种:Shell 内置命令和外部命令。所谓 Shell 内置命令,就是 Shell 自带的命令,这些命令是没有执行文件的;而外部命令就是由程序员单独开发的,是命令,所以会有命令的执行文件。Linux 中的绝大多数命令是外部命令,而 cd 命令是一个典型的 Shell 内置命令,所以 cd 命令没有执行文件所在路径。

命令格式

[root@localhost ~]#cd [目录名]

cd 命令是非常简单的命令,仅有的两个选项 -P 和 -L 的作用非常有限,很少使用:

  • -P(大写)是指如果切换的目录是软链接目录,则进入其原始的物理目录,而不是进入软链接目录;
  • -L(大写)是指如果切换的目录是软链接目录,则直接进入软链接目录。

常见用法

【例 1】基本用法
cd 命令切换目录只需在命令后加目录名称即可。例如:

[root@localhost ~]# cd /usr/local/src/
[root@localhost src]#
#进入/usr/local/src/ 目录

通过命令提示符,我们可以确定当前所在目录已经切换。

【例 2】简化用法
cd 命令可以识别一些特殊符号,用于决速切换所在目录,这些符号如表 1 所示。
 

表 1 cd 命令的特殊符号
特殊符号作 用
~代表用户的家目录
-代表上次所在目录
.代表当前目录
..代表上级目录


这些简化用法以加快命令切换,我们来试试。

[root@localhost src]# cd ~
[root@localhost ~]#

"cd~"命令可以快速回到用户的家目录,cd 命令直接按回车键也是快速切换到家目录。

[root@localhost~]#cd /etc/
[root@localhost etc]#cd
[root@localhost ~]#
# 直接使用 cd 命令,也回到了家目录。


再试试"cd-"命令。

[root@localhost ~]# cd/usr/local/src/
#进入/usr/local/src/目录
[root@localhost src]# cd -/root
[root@localhost ~]#
#"cd-"命令回到进入 src 目录之前的家目录
[root@localhost ~]# cd-
/usr/local/src
[root@localhost src]#
#再执行一遍"cd-"命令,又回到了 /usr/local/src/ 目录。


再来试试"."和".."。

[root@localhost ~]# cd /usr/local/src/
#进入测试目录
[root@localhost src]# cd..
#进入上级目录
[root@localhost local]# pwd
/usr/local
#pwd是査看当前所在目录的命令,可以看到我们进入了上级目 /usr/local/
[root@localhost local]# cd.
#进入当前目录
[root@localhost local]# pwd
/usr/local
#这个命令不会有目录的改变,只是告诉大家"."代表当前目录。

绝对路径和相对路径

cd 命令本身不难,但有两个非常重要的概念,就是绝对路径和相对路径。初学者由于对字符界面不熟悉,所以有大量的错误都是因为对这两个路径没有搞明白,比如进错了目录、打开不了文件、打开的文件和系统文件不一致等。所以我们先来区分一下这两个路径。

首先,我们先要弄明白什么是绝对、什么又是相对。其实我们一直说现实生活中没有绝对的事情,没有绝对的大,也没有绝对的小;没有绝对的快,也没有绝对的慢。这只是由于参照物的不同或认知的局限,导致会暂时认为某些东西可能是绝对的、不能改变的。比如目前我们认为光速是最快的速度,我们不能突破光速的限制。但也有可能随着技术的进步,我们会突破这一限制。

但在 Linux 的路径中是有绝对路径的,那是因为 Linux 有最高目录,也就是根目录。如果路径是从根目录开始,一级一级指定的,那使用的就是绝对路径。例如:

[root@localhost ~]# cd /usr/local/src/
[root@localhost src]# cd /etc/rc.d/init.d/

这些切换目录的方法使用的就是绝对路径。所谓相对路径,就是只从当前所在目录开始,切换目录。例如:

[root@localhost /]# cd etc/
#当前所在路径是/目录,而/目录下有etc目录,所以可以切换
[root@localhost etc]# cd etc/
-bash:cd:etc/:没有那个文件或目录
#而同样的命令,由于当前所在目录改变了,所以就算是同一个命令也会报错,除非在/etc/目录中还有一个etc目录

所以,虽然绝对路径输入更加烦琐,但是更准确,报错的可能性也更小。对初学者而言,笔者还是建议大家使用绝对路径。本教程为了使命令更容易理解,也会尽量使用绝对路径。

再举个例子,假设我当前在 root 用户的家目录中。

[root@localhost ~]#

那么,该如何使用相对路径进入 /usr/local/src/ 目录中呢?

[root@localhost ~]# cd ../usr/local/src/

从我当前所在路径算起,加入".."代表进入上一级目录,而上—级目录是根目录,而根目录中有 usr 目录,就会一级一级地进入 src 目录了。

<think>我们注意到用户在执行命令时遇到了一些问题,主要是在编译ARM架构的汇编文件`led.s`时出现了错误。 用户首先尝试使用`sudo`运行`arm-linux-gnueabihf-gcc`,但提示找不到命令。然后去掉`sudo`尝试,但提示`led.s`文件不存在。 根据用户提供的路径信息: - 用户通过`sudo find ~ -name "led.s"`找到了`led.s`位于`/home/k1/linux/1_leds/led.s` - 然后用户执行了`cd`(回到主目录)和`cd linux`,进入了`~/linux`目录(即`/home/k1/linux`) 问题在于:`led.s`文件实际位于`/home/k1/linux/1_leds/`目录下,而当前工作目录是`/home/k1/linux`,所以直接使用`led.s`作为输入文件是找不到的。 解决方案: 1. 切换到正确的目录:`cd 1_leds`,然后在那个目录下执行编译命令。 2. 或者不切换目录,而是指定完整的文件路径:`arm-linux-gnueabihf-gcc -g -c /home/k1/linux/1_leds/led.s -o led.o` 另外,关于`sudo`的问题:通常我们不需要使用`sudo`来编译自己的代码,除非安装工具链时设置了特殊权限。第一次错误是因为系统在sudo的环境下找不到`arm-linux-gnueabihf-gcc`命令,可能是因为该命令的路径没有包含在root用户的PATH中。而当前用户(k1)的PATH中可能已经配置了该工具链的路径,所以去掉sudo后命令可以找到(尽管文件路径不对)。 所以,建议用户进入正确的目录后再编译: 步骤: 1. `cd ~/linux/1_leds` 2. `arm-linux-gnueabihf-gcc -g -c led.s -o led.o` 如果用户希望将目标文件输出到其他目录,可以指定不同的输出路径,例如: `arm-linux-gnueabihf-gcc -g -c led.s -o ../build/led.o` 但是首先确保输出目录存在。 另外,如果用户之前没有配置好环境变量,可能会遇到工具链未安装或未添加到PATH的问题。但根据第二次执行的错误信息(提示找不到文件),说明工具链命令已经找到,只是文件路径不对。 因此,我们给出以下步骤: 首先,进入包含`led.s`的目录: ```bash cd ~/linux/1_leds ``` 然后,执行编译命令: ```bash arm-linux-gnueabihf-gcc -g -c led.s -o led.o ``` 如果用户希望保留在原来的目录(`~/linux`)下操作,可以这样: ```bash arm-linux-gnueabihf-gcc -g -c 1_leds/led.s -o 1_leds/led.o ``` 解释: - `-g`:生成调试信息。 - `-c`:只编译不链接,生成目标文件。 - `led.s`:输入文件(注意路径)。 - `-o led.o`:指定输出文件名为led.o。 注意:如果工具链确实没有安装,则需要先安装交叉编译工具链。根据错误信息,第一次使用sudo时提示找不到命令,第二次不用sudo时命令找到了(只是文件找不到),所以判断工具链已经安装并配置在用户k1的PATH中。 如果用户在执行上述命令后仍然出现找不到`arm-linux-gnueabihf-gcc`命令,则需要检查工具链的安装和PATH配置。 检查方法: - 执行:`which arm-linux-gnueabihf-gcc` 或者 `echo $PATH` - 如果找不到,可能需要重新安装工具链,或者将工具链路径添加到PATH中,例如: export PATH=$PATH:/path/to/toolchain/bin 但根据之前的情况,用户在没有sudo的情况下可以找到该命令(只是文件路径错误),所以工具链应该已经配置好。 因此,我们主要解决文件路径问题。 现在,我们按照要求给出代码(这里实际上是命令)和解释: 由于用户的问题是关于命令行操作的,我们给出的是bash命令,而不是编程代码。但是我们可以按照类似格式来回答: ``` 首先,请确保进入正确的目录,然后执行编译命令: ```bash cd /home/k1/linux/1_leds arm-linux-gnueabihf-gcc -g -c led.s -o led.o ``` 或者,如果不想切换目录,可以使用相对路径: ```bash arm-linux-gnueabihf-gcc -g -c /home/k1/linux/1_leds/led.s -o /home/k1/linux/1_leds/led.o ``` 但是更简单的方式是切换目录再编译。 解释: - `cd /home/k1/linux/1_leds`:切换到包含源文件`led.s`的目录- `arm-linux-gnueabihf-gcc`:这是针对ARM架构的交叉编译器。 - `-g`:生成调试信息,方便使用GDB调试。 - `-c`:只进行编译,不链接,输出目标文件。 - `led.s`:输入的汇编源文件。 - `-o led.o`:指定输出文件名为`led.o`。 执行成功后,会在当前目录(即`/home/k1/linux/1_leds`)下生成`led.o`目标文件。 ``` 最后,按照要求提出相关问题: §§相关问题§§: 1. 如何将多个汇编源文件编译并链接成一个可执行文件? 2. 如何编写一个Makefile来自动化编译ARM汇编程序? 3. 在ARM汇编中,如何编写一个点灯程序并控制GPIO? 4. 如何将编译好的ARM程序烧录到开发板上运行?</think>根据你的操作记录,问题在于文件路径和工具链配置。以下是详细解决方案: ### 问题分析 1. **文件路径错误**:`led.s`文件位于`/home/k1/linux/1_leds/`目录,但你在`~/linux`目录执行编译命令 2. **sudo权限问题**:交叉编译工具链未配置在`sudo`的环境变量中 3. **工具链未安装**:系统可能未安装`arm-linux-gnueabihf-gcc`工具链 ### 解决方案 #### 1. 切换到正确目录编译 ```bash # 进入包含led.s的目录 cd ~/linux/1_leds # 编译汇编文件(无需sudo) arm-linux-gnueabihf-gcc -g -c led.s -o led.o ``` #### 2. 如果工具链未安装,先安装交叉编译器 ```bash # 更新软件源 sudo apt update # 安装ARM交叉编译工具链 sudo apt install gcc-arm-linux-gnueabihf binutils-arm-linux-gnueabihf # 验证安装 arm-linux-gnueabihf-gcc --version ``` #### 3. 使用完整路径编译(可选) ```bash # 不切换目录的编译方式 arm-linux-gnueabihf-gcc -g -c ~/linux/1_leds/led.s -o ~/linux/1_leds/led.o ``` ### 关键点解释 - **`-g`参数**:生成调试信息,方便使用GDB调试 - **`-c`参数**:仅编译不链接,生成`.o`目标文件 - **路径问题**:Linux是路径敏感系统,必须确保文件路径正确 - **sudo问题**:普通用户环境变量与root不同,建议用普通用户执行编译 ### 完整编译流程示例 ```bash # 1. 进入源码目录 cd ~/linux/1_leds # 2. 编译汇编代码 arm-linux-gnueabihf-gcc -g -c led.s -o led.o # 3. 链接生成可执行文件(假设有main.c) arm-linux-gnueabihf-gcc led.o main.c -o led_app # 4. 查看生成的文件 file led_app # 应显示ARM可执行文件 ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值