Bash、Source、“.”和“./”执行的区别
liuian 2024-12-04 13:48 52 浏览
每日分享最新,最流行的软件开发知识与最新行业趋势,希望大家能够一键三连,多多支持,跪求关注,点赞,留言。
本文探讨了在 Linux 上运行 shell 命令的各种方法。
在Linux 上工作时,您可能会遇到一些未按您预期的方式执行的文件——例如,您可能在当前目录中有一个文件,但是当您输入它的名称时它没有运行。你得到file_name.sh command not found了,但实际上,文件在那里。该文件不起作用,即使具有执行权限,因为当你在 shell 上写一些东西并运行它时,你的$PATH变量会被检查。如果目录内有任何匹配的命令$PATH,例如/usr/bin,它将执行。除非有匹配的命令,否则您将收到错误消息。
因此,您需要解决文件的路径。让我们创建一个简单的Linux shell 脚本并对该脚本具有执行权限。以下示例是用Bash Shell编写的。
mkdir test && cd test
echo 'echo "hello world PID:$ ParentPID:$PPID"' > test.sh
chmod 755 test.sh
创建脚本后,让我们按顺序执行它们。
壳1测试.sh2#test.sh:找不到命令34. 测试.sh5#hello world PID:19245 ParentPID:1924367. ./test.sh # 同上。它只是明确指定当前目录。8#hello world PID:19245 ParentPID:19243910./test.sh #hello world PID:23044 ParentPID:1924511bash test.sh #hello world PID:23045 ParentPID:19245
$PATH除非当前目录在环境变量中,否则直接给出文件名不起作用。当您使用POSIX标准 shell(如 ksh)时,第二个命令也会失败,因为在运行命令 shell 时检查/命令内部是否存在。如果有,那么它会查找您处理的当前工作目录或绝对路径。与此相反,然后它查看里面的命令$PATH。我当前正在处理的目录不在 PATH 内,因此会出现错误。
test.sh
#test.sh: command not found
. test.sh
#hello world PID:19245 ParentPID:19243
. ./test.sh # this is same with above. it is just specifies current directory explicitly.
#hello world PID:19245 ParentPID:19243
./test.sh #hello world PID:23044 ParentPID:19245
bash test.sh #hello world PID:23045 ParentPID:19245
假设您正在使用Bash。通过执行两者. file.sh或. ./file.sh结果来运行文件将是相同的,但不是./test.sh. source和bash命令呢?
如果您使用任何 shell 命令,例如 Bash 或 ksh,您将生成一个新的 shell 来运行该命令。因此,您设置的每个变量在新 shell 中都不可用。另一方面,source使用当前的 shell 并且不产生新的 shell 进程。因此,您在文件中所做的任何更改都会影响您当前的 shell。上面,正如您从输出中看到的那样,当您执行./或bash因为它们正在产生新进程时,PID 会发生变化。如上所示,命令的父进程 ID (PPID)bash test.sh等于命令的进程 ID (PID) . ./test.sh。
让我们设置一个变量并在test.sh脚本中打印它。
bash -posix
test.sh
#bash: test.sh: command not found
. test.sh
#bash: .: test.sh: file not found
. ./test.sh
#hello world PID:23493 ParentPID:19245
./test.sh
#hello world PID:23539 ParentPID:23493
bash test.sh
#hello world PID:23540 ParentPID:23493
exit
显然,该bash test.sh命令没有给出$STR变量输出,因为新的 shell 不知道。它没有设置在新外壳中。让我们在脚本中设置一个变量。
echo 'NEWSTR="WORLD"' >> test.sh
echo 'echo "NEWSTR is $NEWSTR"' >> test.sh
bash test.sh
#hello world PID:25318 ParentPID:19245
#STR is #NEWSTR is WORLD
echo $NEWSTR #this will give empty output
#
. test.sh
#hello world PID:19245 ParentPID:19243
#STR is HELLO #NEWSTR is WORLD
echo $NEWSTR
# WORLD
source test.sh
#hello world PID:19245 ParentPID:19243
# STR is # NEWSTR is WORLD
echo $NEWSTR
# WORLD
.并source在当前 shell 中运行,因此我们可以看到新变量。这就是运行该bash .bashrc命令不会更新您的 PATH 变量的原因。您应该使用source命令运行或使用.. 因此,您必须使用 source 命令来更改 PATH 变量。
最后,让我们尝试使用此信息来更改和设置 PATH 变量。
mkdir directory && cd directory
echo 'echo "FILE"' > file.sh && chmod 755 file.sh
echo 'echo "COMMAND"' > echocommand && chmod 755 echocommand
pwd
# /home/ofk/test/directory
cd
# change PATH variable inside your .profile (or where ever you set PATH) file and add above path
# PATH="$PATH:/home/ofk/test/directory"
bash .profile
# try to run echocommand or file.sh
echocommand
# echocommand: command not found
file.sh
# file.sh: command not found
source .profile
echocommand
# COMMAND
file.sh
# FILE
结论
./或shell命令(bash、ksh)启动新的 shell 并运行命令。
. file_name或source命令在当前 shell 上运行。
相关推荐
- 电脑下边任务栏跑到左边怎么办
-
电脑桌面的菜单栏从底部跑到左边,想要复原的方法如下:1、鼠标右击“任务栏”空白处,在打开的菜单中点击“属性”2、在弹窗中,找到“屏幕上的任务位置”,在它的右侧点一下倒三角。3、点一下“确定”,接下来就...
- win10关闭防火墙通知(win10关闭防火墙通知怎么关闭)
-
可以关闭防火墙win10提醒。因为win10自带的防火墙会有提醒功能,但有些用户会觉得这个提醒不必要,可以关闭。具体操作步骤是:右键点击Windows徽标,选择“Windows防火墙”,点击“高级设置...
- 微软公司介绍(微软公司介绍文案)
-
微软美国跨国科技公司微软(Microsoft)是一家美国跨国科技企业,1975年4月4日创立。2023财年营收2119.15亿美元,[200]公司总部设立在华盛顿州雷德蒙德(Redmond,邻近西雅图...
- 怎样设置电脑桌面密码(设置电脑桌面密码步骤)
-
首先,需要确定你是想设置电脑屏幕保护密码还是系统登录密码。如果是屏幕保护密码,可以在电脑设置中进行修改。打开控制面板,找到“个性化”或“外观和个性化”选项,再找到“屏幕保护器”选项,点击“设置”,在弹...
- 繁体字输入法下载(繁体字输入法下载安装)
-
你下载百度手机输入法,默认的就是双拼,可以自己选择26键拼音输入01打开苹果手机,找到苹果商城,02打开下载中心,搜索“搜狗输入法”,03下载搜狗输入法,04等下载完成后桌面上会显示搜狗输入法,05然...
- 国产操作系统概念股(国产操作系统概念股票)
-
那么怎么构建该系统呢?一般情况下都是从以下几个方面: 第一、选股方法。虽然靠着均线能选股,靠着指标也能选股,但是系统性的选股方法则是要结合宏观经济整体运行位置和环境,行业发展现状和前...
- 电脑主机开机没反应(电脑主机开机没反应电源灯亮)
-
操作方法01第一种情况是电脑完全没有反应,那么就可能是电源没有连接上,检查插线板和机箱插头,重新插好就好了。?02还有是电脑机箱已经开启,但是显示屏还是黑的,那么这种情况就有可能是显示屏的电源没有连接...
- cad激活码2010(cad激活码和序列号)
-
1.首先激活码出现问题,需要进行激活确认。首先需要的中进入电脑C盘。2.可以先点击组织设置隐藏文件夹显示。3.勾选显示隐藏文件夹。4.找到C:\ProgramData文件夹,打开找到CAD文件夹。5....
- 联想windows7笔记本怎么连接网络
-
检查笔记本的无线网卡驱动1.右键我的电脑,点击“属性”,选择左侧“设备管理器”2.点击“网络适配器”,如果方框内没有驱动,请下载驱动精灵万能网卡版安装网卡驱动 二、若发现驱动前面是感叹号的&...
- 淘宝电脑版网页入口(淘宝网电脑版网页官方)
-
网站地址:https://www.taobao.com/网站链接:进入网站服务器IP:116.253.191.241网站描述:淘宝网首页,淘宝网-亚洲最大、最安全的网上交易平台,提供各类服饰、美容...
- 大学生用哪个牌子的笔记本电脑好
-
荣耀MagicBook14英寸轻薄窄边框笔记本电脑(AMD锐龙58G512GFHDIPS正版Office)冰河银这款的性价比较高。也可以根据自己的预算选同系列其他型号。...
- 免费手机模拟器(免费手机模拟器下载)
-
目前能成功在电脑上模拟苹果系统的iOS模拟器,对比市面上常见的安卓模拟器少太多了,主要原因还是iOS系统比较封闭,难于开发。虽然前面说开发很困难,但是国内还是有一些厉害的IT小组成功推出了iOS模拟器...
- 一周热门
- 最近发表
- 标签列表
-
- python判断字典是否为空 (50)
- crontab每周一执行 (48)
- aes和des区别 (43)
- bash脚本和shell脚本的区别 (35)
- canvas库 (33)
- dataframe筛选满足条件的行 (35)
- gitlab日志 (33)
- lua xpcall (36)
- blob转json (33)
- python判断是否在列表中 (34)
- python html转pdf (36)
- 安装指定版本npm (37)
- idea搜索jar包内容 (33)
- css鼠标悬停出现隐藏的文字 (34)
- linux nacos启动命令 (33)
- gitlab 日志 (36)
- adb pull (37)
- python判断元素在不在列表里 (34)
- python 字典删除元素 (34)
- vscode切换git分支 (35)
- python bytes转16进制 (35)
- grep前后几行 (34)
- hashmap转list (35)
- c++ 字符串查找 (35)
- mysql刷新权限 (34)
