linux 更行path,Linux命令行导航提示/技巧3 - CDPATH环境变量

本文介绍CDPATH环境变量的使用方法,包括如何设置基本目录、调整路径顺序等技巧,以简化命令行目录切换。

在本系列的第一部分中,我们详细讨论了cd命令,在第二部分,我们深入研究了pushd和popd命令以及它们派上用场的场景。

继续我们对命令行导航方面的讨论,在本教程中,我们将通过简单易懂的示例来讨论CDPATH环境变量。 我们还将讨论与此变量相关的一些预先详细信息。

但在我们继续之前,值得一提的是,本教程中的所有示例都已在Ubuntu 14.04中使用Bash版本4.3.11(1)进行了测试。

CDPATH环境变量

即使您的命令行工作涉及执行特定目录下的所有操作(例如您的主目录),那么您也必须在切换目录时提供绝对路径。 例如,考虑一下我在/ home / himanshu / Downloads目录中的情况:

$ pwd

/home/himanshu/Downloads

而要求是切换到/ home / himanshu / Desktop目录。 为了做到这一点,通常我必须运行:

cd /home/himanshu/Desktop/

要么

cd ~/Desktop/

要么

cd ../Desktop/

如果我可以运行以下命令,这不容易:

cd Desktop

是的,这是可能的。 这是CDPATH环境变量所在的位置。您可以使用此变量来定义cd命令的基本目录。

如果您尝试打印其值,您将看到默认情况下,此env变量为空:

$ echo $CDPATH

$

现在,考虑到目前为止我们一直在讨论的情况,让我们使用这个环境变量来定义/ home / himanshu作为cd命令的基本目录。

最简单的方法是:

export CDPATH=/home/himanshu

现在,我可以做我以前不能做的 - 从/ home / himanshu / Downloads目录下,成功运行cd Desktop命令。

$ pwd

/home/himanshu/Downloads

$ cd Desktop/

/home/himanshu/Desktop

$

这意味着我现在可以在cd 命令中明确指定/ home / himanshu或〜或../ (或多个../ )下的/ home / himanshu下的任何目录下执行cd。

要记住的要点

所以你现在知道我们如何使用CDPATH环境变量轻松切换到/ from / home / himanshu / Downloads from / to / home / himanshu / Desktop 。 现在考虑一种情况,在/ home / himanshu / Desktop目录中包含一个名为Downloads的子目录 ,而后者则是您要切换的。

但突然间你意识到,做一个cd桌面将带你到/ home / himanshu /桌面 。 所以,为了确保不会发生,你做:

cd ./Downloads

虽然上述命令本身没有问题,但这是您的一个额外的努力(无论如何),特别是考虑到每次出现这种情况时都必须这样做。 这个问题的一个更优雅的解决方案可以是以下列方式最初设置CDPATH变量:

export CDPATH =“。:/ home / himanshu”

这意味着你告诉cd命令首先查找当前工作目录中的目录,然后尝试搜索/ home / himanshu目录。 当然,您是否希望cd命令行为完全取决于您的偏好或要求 - 我在后面讨论这一点的想法是让您知道这种情况可能会出现。

正如您现在所理解的那样,一旦设置了CDPATH env变量,它的值 - 或者它包含的路径集是系统上唯一的cd命令搜索目录的地方(除了当然的情况)你使用绝对路径)。 所以,完全取决于您确保命令的行为保持一致。

继续前进,如果有一个使用具有相对路径的cd命令的bash脚本,那么最好先清除或取消设置CDPATH环境变量,除非你被困在不可预见的问题中。 或者,不是使用终端上的export命令来设置CDPATH,您可以在测试交互式/非交互式shell之后 ,在.bashrc 文件中设置环境变量, 以确保您所做的更改仅被反映在交互式shell中。

路径出现在环境变量值中的顺序也很重要。 例如,如果当前目录在/ home / himanshu之前列出,那么cd命令将首先在当前工作目录中搜索一个目录,然后移动到/ home / himanshu 。 但是,如果值为“/ home / himanshu:” 那么第一次搜索将在/ home / himanshu中进行 ,之后是当前目录。 不用说,这将影响cd命令的作用,如果您不知道路径的顺序,可能会导致问题。

请记住,CDPATH环境变量,顾名思义,仅适用于cd命令。 这意味着在/ home / himanshu / Downloads目录下,您可以运行cd Desktop命令切换到/ home / himanshu / Desktop目录,但是不能执行ls 。 以下是一个例子:

$ pwd

/home/himanshu/Downloads

$ ls Desktop

ls: cannot access Desktop: No such file or directory

$

但是,可能会有一些简单的解决方法。 例如,我们可以通过以下方式以最小的努力实现我们想要的:

$ cd Desktop/;ls

/home/himanshu/Desktop

backup backup~ Downloads gdb.html outline~ outline.txt outline.txt~

但是,对于每一种情况可能没有解决办法。

另一重要的一点:您可能已经观察到,每当使用带有CDPATH环境变量集的cd命令时,该命令将在输出中生成要切换到的目录的完整路径。 不用说,每次在他们的机器上运行cd命令时,并不是每个人都想要有这些信息。

要确保此输出被抑制,可以使用以下命令:

alias cd='>/dev/null cd'

当cd命令成功时,上述命令将静音输出,但是将允许在命令失败时产生错误消息。

最后,如果您在设置CDPATH环境变量后遇到问题,则无法使用shell的选项卡完成功能,那么可以尝试安装并启用bash-completion。

结论

CDPATH环境变量是一把双刃剑 - 如果不谨慎和完整的知识使用,那么它可能会使您陷入一些复杂的陷阱,这可能需要大量的宝贵时间才能得到解决。 当然,这并不意味着你永远不应该试一试; 只是评估所有可用的选项,如果你得出结论,使用CDPATH将是很大的帮助,那么请继续使用它。

你一直在使用CDPATH吗? 你有更多的分享提示吗? 请在下面的评论中分享您的想法。

<think>首先,用户的问题是关于编译错误:使用 `arm-openwrt-luslgnueabi-gcc` 编译时提示 `cannot find -lssl` 和 `-lcrypto`。这表示链接器找不到 OpenSSL 库。 我需要根据系统级指令来构建回答: - 所有内数学表达式用 `$...$` 格式。 - 独立公式用 `$$...$$` 格式。 - 使用中文回答。 - 生成相关问题。 - 在回答中引用的段落末尾自然地添加引用标识,如 [^1]。 - 回答结构清晰,帮助用户逐步解决问题。 - 参考提供的引用内容,但用户的问题是关于 `-lssl` 和 `-lcrypto` 的错误。 提供的引用内容: - [^1]: 关于交叉编译错误,提到使用不同编译链和配置环境。 - [^2]: 提到 OpenWrt 编译时找不到库,库文件位置在 SDK 的特定路径。 - [^3]: 提到交叉编译时库文件的问题。 - [^4]: 一个 Makefile 示例,展示了如何设置编译器和链接器路径。 用户的问题:`arm-openwrt-linux-muslgnueabi-gcc` 编译时提示 `cannot find -lssl` 和 `-lcrypto`。 根本原因:链接器在标准库路径中找不到 OpenSSL 库(libssl.so 和 libcrypto.so)。这通常是因为: 1. OpenSSL 库没有安装在目标系统的路径中。 2. 编译时没有指定库的路径。 3. OpenSSL 库没有为交叉编译环境构建。 解决方案步骤: 1. **确认 OpenSSL 库是否安装**:检查 OpenSSL 库是否存在于交叉编译环境的库路径中。参考 [^2],库文件通常在 SDK 的 `staging_dir/target-.../usr/lib` 目录下。 2. **指定库路径**:在编译命令中添加 `-L` 选项来指定库文件的路径。例如: ```bash arm-openwrt-linux-muslgnueabi-gcc -o output input.c -L/path/to/libs -lssl -lcrypto ``` 其中 `/path/to/libs` 是库文件的位置。 3. **检查库文件的存在**:确保 `libssl.so` 和 `libcrypto.so` 文件确实存在。如果不存在,需要先构建或安装 OpenSSL for OpenWrt。 4. **构建 OpenSSL for OpenWrt**:如果库不存在,可能需要使用 OpenWrt 的 SDK 构建 OpenSSL。步骤如下: - 进入 OpenWrt SDK 目录。 - `make menuconfig` 并选择 OpenSSL 包。 - `make package/openssl/compile` 来构建。 - 构建后,库文件会出现在 `staging_dir` 目录。 5. **设置环境变量**:参考 [^4],在 Makefile 中设置 `STAGING_DIR` 环境变量或直接指定路径。 6. **验证库架构**:参考 [^3],确保库文件是针对 ARM 架构的,而不是主机架构(如 x86_64)。使用 `file` 命令检查库文件。 回答结构: 1. **介绍问题**:简要解释错误原因。 2. **逐步解决方案**: - 检查库是否存在。 - 指定库路径。 - 如何安装或构建 OpenSSL。 3. **示例命令**:提供命令行示例。 4. **添加引用**:自然地引用提供的参考内容。 5. **生成相关问题**:在末尾添加相关问题。 生成相关问题: - 如何为 OpenWrt 交叉编译 OpenSSL? - 如何在 Makefile 中设置库路径? - 交叉编译时常见库缺失问题如何解决? - 如何验证库文件的架构? 确保语言为中文。</think>### 解决 `arm-openwrt-linux-muslgnueabi-gcc` 编译时提示 `cannot find -lssl` 和 `-lcrypto` 的错误 这个错误表示链接器在编译过程中无法找到 OpenSSL 库(`libssl` 和 `libcrypto`),通常发生在交叉编译环境中。根本原因是编译器未能在默认路径中定位到这些库文件。以下是逐步解决方案,确保过程清晰可靠。参考 OpenWrt SDK 的常见实践[^2][^4]。 #### 步骤 1: 确认 OpenSSL 库是否安装 首先,检查交叉编译环境的库路径中是否存在 `libssl.so` 和 `libcrypto.so` 文件。OpenWrt SDK 的库文件通常位于 `staging_dir` 目录下。 - **操作命令**: ```bash # 查找 libssl 和 libcrypto 文件 find /opt/OpenWrt-SDK-*/staging_dir -name "libssl.so*" find /opt/OpenWrt-SDK-*/staging_dir -name "libcrypto.so*" ``` - **预期结果**: - 如果文件存在,路径类似 `/opt/OpenWrt-SDK-ramips-mt7688_gcc-4.8-linaro_uClibc-0.9.33.2.Linux-i686/staging_dir/target-mipsel_24kec+dsp_uClibc-0.9.33.2/usr/lib/libssl.so`[^2]。 - 如果文件不存在,说明 OpenSSL 未安装,需进入步骤 3。 #### 步骤 2: 在编译命令中指定库路径 如果库文件存在,但链接器找不到,需在编译时显式添加库路径。使用 `-L` 选项指定路径,`-lssl` 和 `-lcrypto` 链接库。 - **示例命令**: ```bash arm-openwrt-linux-muslgnueabi-gcc -o your_app your_source.c -L/path/to/libs -lssl -lcrypto ``` - 替换 `/path/to/libs` 为实际库路径,例如 `/opt/OpenWrt-SDK-*/staging_dir/target-*/usr/lib`[^2]。 - **在 Makefile 中设置**:参考引用[^4],在 Makefile 中添加库路径和链接选项: ```makefile CC = arm-openwrt-linux-muslgnueabi-gcc CXX = arm-openwrt-linux-muslgnueabi-g++ # 设置库路径 LDFLAGS = -L$(TOOL_CHAIN_ROOT_DIR)/staging_dir/target-*/usr/lib -lssl -lcrypto # 编译规则 your_app: your_source.o $(CC) -o $@ $^ $(LDFLAGS) ``` #### 步骤 3: 安装或构建 OpenSSL 库(如果库不存在) 如果步骤 1 中未找到库文件,需为 OpenWrt 交叉编译 OpenSSL。 - **子步骤 3.1: 使用 OpenWrt SDK 构建 OpenSSL** 1. 进入 OpenWrt SDK 目录: ```bash cd /path/to/OpenWrt-SDK ``` 2. 配置并选择 OpenSSL 包: ```bash make menuconfig ``` - 导航到 `Libraries` > `libopenssl`,按 `Y` 启用。 3. 编译 OpenSSL: ```bash make package/openssl/compile V=s ``` - 编译后,库文件生成在 `staging_dir/target-*/usr/lib` 下[^2]。 - **子步骤 3.2: 手动交叉编译 OpenSSL** 如果 SDK 不可用,下载 OpenSSL 源码并交叉编译: ```bash wget https://www.openssl.org/source/openssl-1.1.1w.tar.gz tar -xvf openssl-1.1.1w.tar.gz cd openssl-1.1.1w # 配置为 OpenWrt 目标架构(例如 ARM) ./Configure linux-armv4 --cross-compile-prefix=arm-openwrt-linux-muslgnueabi- --prefix=/opt/openssl-install make make install ``` - 编译后,库文件在 `/opt/openssl-install/lib` 中,在编译命令中添加 `-L/opt/openssl-install/lib`。 #### 步骤 4: 验证库文件架构 确保库文件匹配目标架构(ARM),避免主机架构(如 x86_64)不兼容问题。使用 `file` 命令检查: ```bash file /path/to/libs/libssl.so ``` - **预期输出**:类似 `ELF 32-bit LSB shared object, ARM, version 1 (SYSV), dynamically linked`[^3]。如果显示 `x86_64`,需重新交叉编译。 #### 常见问题排查 - **环境变量设置**:在编译前设置 `STAGING_DIR`,确保编译器识别 SDK 路径: ```bash export STAGING_DIR=/opt/OpenWrt-SDK-*/staging_dir ``` - **符号链接问题**:如果库文件是软链接(如 `libssl.so -> libssl.so.1.1`),确保链接目标存在。 - **权限问题**:使用 `chmod +x /path/to/libs/*.so` 添加执权限。 通过以上步骤,错误应被解决。如果问题持续,检查编译链是否完整安装[^1]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值