当前位置: 首页 > 科技观察

Bash、Source、“.”和“.-”执行之间的区别

时间:2023-03-13 14:14:22 科技观察

本文探讨了在Linux上运行shell命令的各种方式。在Linux上工作时,您可能会遇到一些行为与您预期不同的文件——例如,您可能在当前目录中有一个文件,但当您键入其名称时它并没有运行。你得到file_name.shcommandnotfound,但实际上,文件在那里。即使具有执行权限,该文件也不起作用,因为当您在shell上写一些东西并运行它时,您的$PATH变量会被检查。如果$PATH里面有匹配的命令,比如/usr/bin,就会执行。除非有匹配的命令,否则您将收到错误消息。所以你需要解析文件的路径。让我们创建一个简单的Linuxshell脚本并赋予脚本执行权限。以下示例是用BashShell编写的。mkdirtest&&cdtestecho'echo"helloworldPID:$$ParentPID:$PPID"'>test.shchmod755test.sh创建脚本后,让我们依次执行它们。shell1test.sh2#test.sh:commandnotfound34.test.sh5#helloworldPID:19245ParentPID:1924367。./test.sh#同上。它只是明确指定当前目录。8#helloworldPID:19245ParentPID:19243910./test.sh#helloworldPID:23044ParentPID:1924511bashtest.sh#helloworldPID:23045ParentPID:19245$PATH除非当前目录在环境变量中否则直接给文件名不起作用。当您使用像ksh这样的POSIX标准shell时,第二个命令也会失败,因为在运行命令shell时会检查里面的/command是否存在。如果有,那么它会查找当前工作目录或您正在处理的绝对路径。相反,它会在$PATH中查找命令。我当前正在处理的目录不在PATH中,因此出现错误。test.sh#test.sh:找不到命令。test.sh#helloworldPID:19245ParentPID:19243。./test.sh#同上。它只是明确指定当前目录。#helloworldPID:19245ParentPID:19243./test.sh#helloworldPID:23044ParentPID:19245bashtest.sh#helloworldPID:23045ParentPID:19245假设你正在使用Bash。通过同时执行.file.sh或../file.sh来运行文件会产生相同的结果,但不会产生./test.sh。source和bash命令呢?如果您使用任何shell命令,例如Bash或ksh,您将生成一个新的shell来运行该命令。因此,您设置的每个变量在新shell中都将不可用。另一方面,source使用当前的shell而不会产生新的shell进程。因此,您对该文件所做的任何更改都会影响您当前的shell。从上面的输出中可以看出,当您执行./或bash时,PID会发生变化,因为它们正在生成新进程。如上所示,命令的父进程ID(PPID)bashtest.sh等于命令的进程ID(PID)。./测试.sh。让我们设置一个变量并在test.sh脚本中打印它。bash-posixtest.sh#bash:test.sh:找不到命令。test.sh#bash:.:test.sh:找不到文件。./test.sh#helloworldPID:23493ParentPID:19245./test.sh#helloworldPID:23539ParentPID:23493bashtest.sh#helloworldPID:23540ParentPID:23493exit显然,bashtest.sh命令不提供$STR变量输出,因为新shell不知道它。它没有在新的shell中设置。让我们在脚本中设置一个变量。echo'NEWSTR="WORLD"'>>test.shecho'echo"NEWSTRis$NEWSTR"'>>test.shbashtest.sh#helloworldPID:25318ParentPID:19245#STRis#NEWSTRisWORLDecho$NEWSTR#this将给出空输出#.test.sh#helloworldPID:19245ParentPID:19243#STRisHELLO#NEWSTRisWORLDecho$NEWSTR#WORLDsourcetest.sh#helloworldPID:19245ParentPID:19243#STRis#NEWSTRisWORLDecho$NEWSTR#世界。source在当前shell中运行,因此我们可以看到新变量。这就是为什么运行bash.bashrc命令不会更新您的PATH变量的原因。您应该使用source命令运行或使用..因此您必须使用source命令来更改PATH变量。最后,让我们尝试使用此信息来更改和设置PATH变量。mkdirdirectory&&cddirectoryecho'echo"FILE"'>file.sh&&chmod755file.shecho'echo"COMMAND"'>echocommand&&chmod755echocommandpwd#/home/ofk/test/directorycd#更改你的.profile(或你设置PATH的地方)文件并在路径上方添加#PATH="$PATH:/home/ofk/test/directory"bash.profile#trytorunechocommandorfile.shechocommand#echocommand:commandnotfoundfile.sh#file.sh:commandnotfoundsource.profileechocommand#COMMANDfile.sh#FILECon??clusion./或shell命令(bash,ksh)启动一个新的shell并运行命令。.file_name或source命令在当前shell上运行。