Linux中sh与./下执行的问题

本文探讨了文件执行权限的问题,特别是当文件a不具有执行权限时,通过不同方式尝试执行该文件所产生的不同结果。

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

1、首先创建的文件名称为a,当a没有执行权限时,$sh  a 是可以执行的,而./a会提示没有权限。
<think>我们正在讨论Linux命令中的`./`前缀的作用。根据引用内容,我们可以总结以下几点:1.**为什么需要`./`**:-在Unix/Linux系统中,执行一个可执行文件时,系统会在`PATH`环境变量指定的目录中查找该命令。-如果当前目录在`PATH`中,那么要执行当前目录下的命令,就需要指定路径。`./`表示当前目录,因此使用`./command`来执行。2.**Windows的区别**:-在Windows中,当前目录默认在搜索路径中,因此需要加`./`(但加上也可以)。3.**何时需要加`./`**:-当你要执行当前目录下的可执行文件(包括脚本)时,而该目录在`PATH`中,就需要加`./`。-例如,你在`/etc/init.d`目录下,执行`sshd`脚本,由于`/etc/init.d`通常在`PATH`中,所以需要`./sshd`。4.**其他执行脚本的方式**:-直接使用`./script.sh`会启动一个新的子shell执行脚本。-使用`sourcescript.sh`或`.script.sh`(注意点后面有空格)则会在当前shell环境中执行脚本,这样脚本中设置的环境变量会影响当前shell。5.**关于`PATH`环境变量**:-可以通过修改`.bash_profile`等配置文件,将当前目录(用`.`表示)加入`PATH`,这样以后就可以直接执行当前目录下的命令而需要加`./`。但是,出于安全考虑,通常建议将当前目录加入`PATH`,因为可能会意外执行当前目录下的恶意程序。6.**引用中的例子**:-在`/etc/init.d`目录下,直接输入`sshd`,系统可能执行了`PATH`中其他目录下的`sshd`(如`/usr/sbin/sshd`),而输入`./sshd`则执行当前目录下的脚本。因此,`./`的作用是指定执行当前目录下的可执行文件或脚本,以区别于`PATH`中的命令。现在,根据用户的问题,我们需要解释`./`的作用,并参考引用内容进行回答。回答结构:1.解释`./`的作用:指定当前目录下的可执行文件。2.为什么需要它:因为当前目录通常在`PATH`中。3.何时使用:当执行当前目录下的可执行文件或脚本时。4.其他执行方式的区别(如`source`或直接使用脚本名)。5.安全提示:建议将当前目录加入`PATH`。同时,生成相关问题。</think>### Linux 中 `./` 在命令执行中的作用解析 #### 1. **核心作用:路径标识符** `./` 是 Linux 中表示**当前目录**的路径标识符。其核心作用包括: - **指定执行位置**:当执行 `./command` 时,明确告知系统在当前目录下寻找并执行 `command` 文件 - **规避 PATH 限制**:Linux 默认在 `PATH` 环境变量中搜索当前目录(安全设计),必须显式指定路径[^1] - **精确控制版本**:防止系统 `/bin`、`/usr/bin` 等目录下的同名命令冲突 #### 2. **使用场景对比** | **场景** | **是否需要 `./`** | **原因说明** | |------------------------|-------------------|----------------------------------------------------------------------------| | 执行系统命令 (如 `ls`) | ❌ 需要 | 命令位于 `/bin` 等 `PATH` 包含的目录 | | 执行当前目录的脚本 | ✅ 需要 | 当前目录默认在 `PATH` 中[^1] | | 执行上级目录脚本 | ❌ 需要 | 应使用相对路径如 `../script.sh` | | 执行绝对路径脚本 | ❌ 需要 | 如 `/home/user/script.sh` 已包含完整路径 | #### 3. **执行方式差异** - **`./script.sh`** 启动新的子 Shell 执行脚本,环境变量和目录更改**影响**当前 Shell[^2] ```bash $ ./demo.sh # 修改环境变量仅在此次执行有效 $ echo $VAR # 空值(变量未传递到父Shell) ``` - **`. script.sh`** (点+空格) 等同于 `source` 命令,在**当前 Shell 环境**执行脚本[^2] ```bash $ . demo.sh # 修改的环境变量会保留 $ echo $VAR # 显示脚本设置的值 ``` #### 4. **安全机制解析** Linux 默认设计( Windows 同): - 🔒 **禁止自动搜索当前目录**:防止恶意程序劫持常用命令(如将恶意 `ls` 放在下载目录) - ⚠️ **显式路径要求**:用户必须主动确认执行位置,避免误操作 - 💡 修改 `PATH` 可绕过(但推荐): ```bash # 在 ~/.bashrc 添加(存在安全风险) export PATH=$PATH:. ``` #### 5. **典型用例演示 ```bash # 案例1:执行编译后的程序 $ gcc -o myapp main.c $ ./myapp # 必须加./,否则报"command not found" # 案例2:运行配置脚本 $ cd /etc/nginx $ ./configure # 执行当前目录的configure脚本 # 案例3:权限足时的报错 $ ./script.sh -bash: ./script.sh: Permission denied $ chmod +x script.sh # 需先添加执行权限 ``` #### 6. **直接命令的区别** - **`sshd` vs `./sshd`** - `sshd`:执行 `PATH` 中的系统守护进程(如 `/usr/sbin/sshd`) - `./sshd`:执行当前目录的**控制脚本**(如 `/etc/init.d/sshd`)[^1] ```bash $ /etc/init.d/sshd status # 等价于 ./sshd status ``` > ⚠️ **关键原则**:Linux 所有可执行文件必须通过**绝对路径**、**相对路径**或 `PATH` 注册路径访问,`./` 是最常用的相对路径指定方式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值