执行可执行文件

执行文件就是具有可执行权限的文件,如果在文件所在目录上执行 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

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

  1. Linux下top订购具体解释

    Linux下top订购具体解释 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvempmMjgwNDQxNTg5/font/5a6L5L2T/fontsize ...

  2. Linux command stty

    Linux command stty reference: https://blog.csdn.net/lqxandroid2012/article/details/78929506 [Purpose ...

  3. linux command lynx

    [Purpose]        Learning linux command  lynx   [Eevironment]        Ubuntu 16.04 terminal   apt-get ...

  4. 《The Linux Command Line》 读书笔记04 Linux用户以及权限相关命令

    Linux用户以及权限相关命令 查看身份 id:Display user identity. 这个命令的输出会显示uid,gid和用户所属的组. uid即user ID,这是账户创建时被赋予的. gi ...

  5. 《The Linux Command Line》 读书笔记02 关于命令的命令

    <The Linux Command Line> 读书笔记02 关于命令的命令 命令的四种类型 type type—Indicate how a command name is inter ...

  6. 《The Linux Command Line》 读书笔记01 基本命令介绍

    <The Linux Command Line> 读书笔记01 基本命令介绍 1. What is the Shell? The Shell is a program that takes ...

  7. Linux Command Line Basics

    Most of this note comes from the Beginning the Linux Command Line, Second Edition by Sander van Vugt ...

  8. Linux Command Line 解析

    Linux Command Line 解析 0 处理模型 Linux kernel的启动包括很多组件的初始化和相关配置,这些配置参数一般是通过command line进行配置的.在进行后续分析之前,先 ...

  9. 15 Examples To Master Linux Command Line History

    When you are using Linux command line frequently, using the history effectively can be a major produ ...

随机推荐

  1. iOS 将对象的属性和属性值拆分成key、value,通过字符串key来获取该属性的值

    这篇博客光看标题或许就会产生疑问,某个对象,只要它存在某个属性,且值不是空的,不就能直接用点方法获取吗,为什么要拆分成key和value多此一举呢?下面,我用一个例子告诉大家,既然这方法是存在的,那就 ...

  2. Kubernetes日志收集

    关于kubernetes的日志分好几种,针对kubernetes本身而言有三种: 1.资源运行时的event事件.比如在k8s集群中创建pod之后,可以通过 kubectl describe pod ...

  3. iOS面试必看经典试题分析

    > **不用临时变量怎么实现两个数据的交换?** 方式一:加减法的运算方式求解new_b = a - b + b = a;new_a = a + b - a = b;一个简单的运算方式,最重要的 ...

  4. PRINCE2 有级别吗?

    PRINCE2是分级别的,有基础级和专业级两个级别 Foundation基础级考试没有报考条件限制, 完全根据学员掌握知识的能力和实际工作经验 Practitioner 专业级考试不可越级 1.持有P ...

  5. 多线程CountDownLatch和Join

    如果现在有五个线程A.B.C.D.E,请问如何用E线程用于统计A.B.C.D四个线程的结果? 题意需要用E线程统计A.B.C.D四个线程,也就是说E线程必须要等到前面四个线程运行结束之后才能执行.那么 ...

  6. 用代码控制退出APP

    + (void)exitApplication { AppDelegate *app = [UIApplication sharedApplication].delegate; UIWindow *w ...

  7. 【Egret】使用Egret开发的HTML5项目,使用本地电脑作为服务器进行移动端调试流程

    流程: 1.先开启本机IIS服务器 具体开启流程如下:http://www.jb51.net/article/29787.htm 2.添加服务器MIME类型, 按照以下两个教程把所有的MIME类型都添 ...

  8. google官方的下拉刷新+自定义上拉加载更多

    转载请标注转载:http://blog.csdn.net/oqihaogongyuan/article/details/50949118 google官方的下拉刷新+自定义上拉加载更多 现在很多app ...

  9. JavaScript原生Array常用方法

    JavaScript原生Array常用方法 在入门Vue时, 列表渲染一节中提到数组的变异方法, 其中包括push(), pop(), shift(), unshift(), splice(), so ...

  10. Mac系统-java环境搭建_01

    一.安装jdk 下载地址:http://www.oracle.com/technetwork/Java/javase/downloads/index-jsp-138363.html 1.傻瓜式安装下一 ...