command not found 问题解释

执行可执行文件

执行文件就是具有可执行权限的文件,如果在文件所在目录上执行 ll 或 ls -l命令时,可能看到如下结果:
-rwxr-xr-- 1 usr users 289 Jul 29 09:15 cronmonth
其中的x就表示文件的属主对文件具有可执行权限。

假设nginx的安装目录在 /usr/share/nginx/ ,它的可执行文件就是 /usr/share/nginx/sbin/nginx,有两种简单的方式可以启动nginx。

绝对路径方式

也就是从根目录 / 开始一直到可执行文件的完整路径: /usr/share/nginx/sbin/nginx

相对路径方式

先用 cd 跳转到可执行文件所在的目录,也就是先执行 cd /usr/share/nginx/sbin,再以相对当前位置的相对路径执行: ./nginx
同理,如果当前工作路径是在 /usr/share/nginx/conf,那么仍然可以用相对路径:../sbin/nginx

用相对路径而不是绝对路径的好处就是不用敲那么多字,但有些场合下还是用绝对路径好,比如cron脚本里调用其他脚本时,最好用绝对路径指定被调用脚本。

执行shell脚本

有可执行权限的shell脚本

这种情况跟执行可执行文件一样,都可以用绝对路径/相对路径的方式来执行。

没有可执行权限的shell脚本

有时候并不需要给shell脚本可执行权限,却仍然可以执行这些脚本,方法就是调用shell脚本解释器来解释执行脚本。

调用shell解释器有几种方式:

  • sh /path/to/script:用sh命令调用。
  • bash /path/to/script:如果系统安装有bash的话。
  • source /path/to/script
  • . /path/to/script:注意句点与脚本路径之间至少有一个空格。

PATH环境变量

假如当前目录下具有一个可执行的文件 abc,在shell命令行直接输入 abc,然后回车,得到的是大概是“Command not found”的提示;
而直接输入 ls,然后回车,却可以列出当前目录下的文件和子目录。很奇怪?当前目录下明明有 abc这个可执行文件却说命令找不到,当前目录下根本就没有文件的文件名里有ls这两个字符的命令却可以正确执行!

这是 PATH 环境变量的功劳。

当输入的命令不带有路径信息时,系统默认会从PATH环境变量所指定的目录下查找,所以在bin目录下而有没有配置path的时候,要使用./command方式执行。

这是我的VPS里的 PATH 环境变量的值:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:

在linux下,PATH 所指定的各个路径之间的分隔符是冒号:,系统查找命令的文件时,会把命令与 PATH指定的每个路径拼接起来,看得到的路径是否存在,如果都不存在则提示命令找不到;如果找到一个存在的,检查用户是否有执行的权限,如果有则执行命令,否则提示“Permission denied”。

对于前面提到的 ls命令,先与 PATH 指定的第一路径拼接得到 /usr/local/sbin/ls,该文件不存在,则继续下一个路径/usr/local/bin,得到/usr/local/bin/ls,也不存在,继续下一个,直到 /bin 目录下找到且有执行权限,则执行命令。

对于 abc,虽然当前目录下有名为 abc的可执行文件,但当前目录不在 PATH 所指定的目录,所以系统没法找到,从而提示命令找不到。

好处

有了 PATH 环境变量,我们就不用敲入命令的完整路径或先调整到命令所在的目录,而是直接敲入命令名称即可,方便很多。

就行我们在系统安装Java的时候,除了配置一个JAVA_HOME环境变量外,还会把 $JAVA_HOME/bin 加入PATH 变量,就是这个原因,为了方便!

Windows下的命令执行方式

windows也有 PATH 环境变量,不过它的分隔符是分号;

不过windows下,系统查找命令时除了在 PATH 环境变量下查找外,还会在当前目录下查找,也就是,如果当前目录下有 abc.bat 这么一个批处理文件,即使没把当前目录加入到 PATH 环境变量,只要把dos路径调整到当前目录,直接输入 abc.bat ,也可以执行这个脚本。

文章引自:http://coderbee.net/index.php/linux/20130730/338

时间: 2024-10-09 16:52:09

command not found 问题解释的相关文章

cmd批处理转义字符%的详细解释

cmd批处理转义字符%的详细解释 在命令行中使用for时不需要双%,这源于命令解释器对命令行与批处理的处理方式不同. 1.%是个ESCAPE字符,通常将之译为转义字符,但也有更形象的译名脱逸字符.逃逸字符等.也就是说%不仅仅将与其相关的特定字符串转义并替换为特定字符串,而且自身也会被“脱逸”.而且类似于C语言中的转义字符"\",双%会转义并脱逸为单%,四%则脱为双%. 2.for本身是一个特殊的命令,类似于一个特化的命令解释器,因为它的功能实现需要执行多条语句,因此它必须也具有对命令行

DOS命令大全--具体解释

在Linux和Windows下都能够用nslookup命令来查询域名的解析结果 DOS命令大全一)MD--建立子文件夹 1.功能:创建新的子文件夹 2.类型:内部命令 3.格式:MD[盘符:][路径名]〈子文件夹名〉 4.使用说明: (1)"盘符":指定要建立子文件夹的磁盘驱动器字母,若省略,则为当前驱动器: (2)"路径名":要建立的子文件夹的上级文件夹名,若缺省则建在当前文件夹下. 例:(1)在C盘的根文件夹下创建名为FOX的子文件夹:(2)在FOX子文件夹下再

重构:用Command替换条件调度程序

注:该随笔受启发于 <重构与模式>  第七章 第7.6小节 用Command替换条件调度程序 . 对于Command不做过多解释,这里我找了两个例子.供部分园友参阅:Command例子1 Command例子2 . 条件调度程序:我对这个名词的理解为,它是相对简单的选择结构 与 相对独立的业务逻辑的结合体. 话不是很好理解,下面举个小例子吧. 重构前的代码: /// <summary> /// 很简单的选择分支 一层 if else /// N个 相对独立 任务 /// </s

逃逸字符%的详细解释

1.%是个ESCAPE字符,通常将之译为转义字符,但也有更形象的译名脱逸字符.逃逸字符等.也就是说%不仅仅将与其相关的特定字符串转义并替换为特定字符串,而且自身也会被“脱逸”.而且类似于C语言中的转义字符"\",双%会转义并脱逸为单%,四%则脱为双%. 2.for本身是一个特殊的命令,类似于一个特化的命令解释器,因为它的功能实现需要执行多条语句,因此它必须也具有对命令行(特指do后的命令行)分析处理的功能.而command/cmd实现for时自然会借用自身原有的命令行分析模块,因此fo

C# .NET更智能的数据库操作的封装

前述: 对数据库操作的封装,相信网络上已经有一大堆,ORM框架,或者是.NET本身的EF,都很好的支持数据库操作.这篇文章是分享自己所思考的,对数据库操作的简单封装.我对于这篇文章,认为被浏览者所关注重点的是怎么分析设计数据库操作封装,代码是其次.而且,这是我第一篇文章,为了想好怎么实现花了些天,代码是博客发表时现写的.所以我想,使用可能还有bug,而且没有try catch异常的设计. 这个框架我理应做到对数据库无关,无论是哪个数据库都能够使用.不过,重点在于分析,而不是代码.所以,为了更好的

FTP命令

FTP命令是Internet用户使用最频繁的命令之一,不论是在DOS还是UNIX操作系统下使用FTP,都会遇到大量的FTP内部命令.熟悉并灵活应用FTP的内部命令,可以大大方便使用者,并收到事半功倍之效.ftp命令用来设置文件系统相关功能.ftp服务器在网上较为常见,Linuxftp命令的功能是用命令的方式来控制在本地机和远程机之间传送文件,这里详细介绍Linux ftp命令的一些经常使用的命令,相信掌握了这些使用Linux进行ftp操作将会非常容易. [转载使用,请注明出处:http://bl

Linux下文件查找与定位

Linux下一切皆文件,但是文件由于文件的属性的不同,在查找上可以针对不同的文件做相应的查找以便加快查询速度和减少资源的消耗. 1 .   which 命令[可执行文件的查找,系统文件中检索]:此命令是查找显示可执行命令的路径和别名,通过查找可以确定在/sbin . /usr/sbin. /usr/bin .哪个目录下, 是在系统和用户环境变量中存在的目录文件中查找的. 参数 解释 --all,  -a Print all matching executables in  PATH, not j

BATCH(BAT批处理命令语法)

bat语法备忘扩展名是bat(在nt/2000/xp/2003下也可以是cmd)的文件就是批处理文件[@[email protected]] bat语法备忘扩展名是bat(在nt/2000/xp/2003下也可以是cmd)的文件就是批处理文件. ==== 注 ======================================= .bat是dos下的批处理文件 .cmd是nt内核命令行环境的另一种批处理文件 从 更广义的角度来看,unix的shell脚本以及其它操作系统甚至应用程序中由外

Hadoop集群日常运维

(一)备份namenode的元数据 namenode中的元数据非常重要,如丢失或者损坏,则整个系统无法使用.因此应该经常对元数据进行备份,最好是异地备份. 1.将元数据复制到远程站点 (1)以下代码将secondary namenode中的元数据复制到一个时间命名的目录下,然后通过scp命令远程发送到其它机器 #!/bin/bash export dirname=/mnt/tmphadoop/dfs/namesecondary/current/`date +%y%m%d%H` if [ ! -d