Linux—如何运行自己编写的程序可以像运行 ls 一样,不用指明程序所在路径?

39 篇文章 2 订阅
1 篇文章 0 订阅

问题:如何运行自己编写的程序可以像运行 ls 一样,不用指明程序所在路径?

  首先,自己先编写一个简单的 test.c 文件。

//test.c
#include<stdio.h>
int main()
{
	printf("Hello World!\n");
	return 0;
}

  然后使用 gcc 编译器编译生成可执行文件 app,并执行 app

$ gcc-o app test.c
$ ./app
Hello World!

  ./ 是指在当前目录下寻找可执行程序 app

  接下来查看一下命令 ls 所在目录的位置,可以看到命令 ls 所在目录为 /bin/ls ,使用 file 命令查看一下信息,file 命令可以识别出文件的类型和编码格式

$ which ls
/bin/ls
$ file /bin/ls
/bin/ls: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[shal]=0x83531f308flfal8221be53eaf399303400C14638, stripped
$ file app
app: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[shal]=0xfedl964337ae887f0f39a6a703c6f36e6f3db60e, not stripped

  可以看出 lsapp 都是 32 位的可执行程序/文件,那为什么不管在那个目录下使用 ls 都不用敲 ls 的路径,而执行自己编写的 app 文件却必须要指明 app 所在路径呢?

 ㊨ 注释:
  ELF 类似于 Windows 下的 EXE 文件,表示它是一个可执行程序。
  32-bit 说明是 32 位的。
  executable 意思是可执行程序。
  处理器是 Intel 80386

解决办法

  我们使用命令 env 查看一个叫做 PATH 的环境变量:

$ env
SSH_AGENT_PID=2134
GPG_AGENT_INFO=/tnp/keyring-OcsKSs/gpg:0:1
TERM=xterm
SHELL=/bin/bash
XDG_SESSION_COOKIE=b084a361432bl8c07f8dbl9f00000009-1588921779.239579-1269806679 WINDOWID=58720262
GNOME_KEYRING_CONTROL=/tnp/keyring-OcsKSs
......
PATH=/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
......
$ echo $PATH (使用 echo $变量名 可以只查看你要查看的这个变量的相关信息)
/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
$ which ls																			   ↑↑↑
/bin/ls

  ㊨ 注释:其中的 “ : ” 是并列的意思。/bin 目录的权限是 root 普通用户不能对该目录进行添加或者修改文件。

  可以看到 ls 所在的路径 /bin 也在 PATH 里面,那么为什么使用 ls 不用指明路径呢?shell 命令解释器会优先PATH 包含的路径下找有没有对应叫作 ls 的可执行的程序,找着找着在 /bin 目录下找到了 ls,所以就不用敲路径了。

  也就是说在 PATH 所包含的路径下的可执行程序,在执行时是不用指明路径的,直接敲可执行程序的名字然后回车就可以了。这就是为什么使用 ls 可以直接使用的原因,而自己编写的可执行程序不能直接使用,是因为自己编写的程序所在目录/路径,没有在 PATH 所包含的路径下,所以要指明路径,才能使用。

方法一

  如果我们使用 root 权限将我们所写的程序拷贝到 /bin 目录下,那样就可以直接执行自己写的程序了。这个方法不是很理想,操作很简单就不做演示了。

方法二

  如何不将自己写的软件拷贝到 /bin 目录,就在原来目录下,执行自己编写的软件二不用包含路径直接执行呢?

  我们可以将自己编写的程序所在目录/路径包含到 PATH 下,这样就可以直接执行自己编写的程序了。

  在用户目录下有一个隐藏文件 .bashrc ,“ . ” 是隐藏的意思;bashshell 内就有 bash 是一个命令处理器;rc 是配置的意思;所以 .bashrc 的意思是 bash 的隐藏控制文件。

~$ ls -a .bashrc
.bashrc
~$ gedit .bashrc (功能是打开 .bashrc 文件;)
(打开之后,拉到最下面,写上下面这句话:
export PATH=$PATH:/home/username/dir(程序所在目录)
    export 是声明一个变量PATH;
    PATH=$PATH: 的意思的是先取出 $PATH 中原有的内容,":"是在原有的内容后并列上新的内容,
我们这里新的路径就是所编写的程序的所在路径,然后保存退出即可。)

  操作示例图:

在这里插入图片描述

  完成上述操作之后,一定要重新打开一个终端,来运行 app 。我们如果在原来的终端(操作窗口)直接使用 app 这个程序的话,还是不能直接运行,这是因为我们修改的是 shellbash 配置文件,配置文件是在一个程序重新启动才会生效,所以原来的操作窗口修改的配置文件没有生效

  新打开一个终端之后,随便在一个目录下运行 app 这个程序。

$ app
Hello World!
$

  这样我们就解决了这个问题,可以不用修改自己编写的软件所在路径,就存放在自己想要存放的目录下,不用指明所在路径,再任意目录下都可以运行自己编写的软件了,此时你再用 echo $PATH 时,就可以看到你添加的路径与其他原有路径并列在一起。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值