use*_*136 59 bash executable shell-script
如果 script.sh 只是一些典型的东西
#!/bin/bash
echo "Hello World!"
Run Code Online (Sandbox Code Playgroud)
有没有首选的方式来运行脚本?我认为您首先必须对其进行 chmod 使其成为可执行文件?
hel*_*ylo 72
对于您的特定脚本,任何一种方式都可以工作,除了./script.sh需要执行和可读位,而bash script.sh只需要可读位。
权限要求不同的原因在于解释你的脚本的程序是如何加载的:
./script.sh 使您的 shell 运行该文件,就好像它是一个常规的可执行文件一样。shell fork 自己并使用系统调用(例如execve)使操作系统在 fork 进程中执行文件。操作系统将检查文件的权限(因此需要设置执行位)并将请求转发给程序加载器,程序加载器查看文件并确定如何执行它。在 Linux 中编译的可执行文件以ELF幻数开头,而脚本以#!( hashbang )开头。hashbang 头意味着该文件是一个脚本,需要由 hashbang 之后指定的程序进行解释。这允许脚本本身告诉系统如何解释脚本。
使用您的脚本,程序加载器将执行/bin/bash并./script.sh 作为命令行参数传递。
bash script.sh使您的 shell 运行bash并script.sh作为命令行参数传递因此操作系统将加载bash(甚至不查看script.sh,因为它只是一个命令行参数)。然后创建的bash进程将解释 ,script.sh因为它是作为命令行参数传递的。因为script.sh只是bash作为普通文件读取,所以不需要执行位。
不过我建议使用./script.sh,因为您可能不知道脚本需要哪个解释器。因此,让程序加载器为您确定。
xx4*_*x4h 22
bash script.sh直接使用 bash 调用脚本。
./script.sh正在使用shebang#!/bin/bash来确定如何执行。
如果您真的想知道,如果您执行 a,bash script.sh您可以使用which bash.
所以在你的例子中它没有区别。是的,您必须chmod +x script.sh能够直接通过./script.sh.
小智 10
创建一个文件 Delete_Self.sh 像这样:
#!/bin/rm
echo I am still here!
Run Code Online (Sandbox Code Playgroud)
运行此脚本,sh Delete_Self.sh您将看到“我还在这里!” 回响了。
使其可执行,然后运行它,因为./Delete_Self.sh您将看到没有任何回显,而文件Delete_Self.sh本身却消失了。
所以区别在于:
bash script.sh将忽略 #! 行,因为 bash 被指定为运行 script.sh 的程序。./script.sh将读取 #! 行来确定要运行的程序script.sh。小智 5
除了其他答案之外,了解通过./script.sh(i) 和source ./script.sh(ii) 运行脚本之间的区别很有用 - (i) 版本创建一个新的 shell 来运行命令,而 (ii) 在当前版本中运行它shell - 如果可执行文件更改了可执行文件退出后需要保留的环境变量,则该命令可能是强制的。例如,要激活 python conda 环境,必须使用以下命令:
source activate my_env
Run Code Online (Sandbox Code Playgroud)
source注意您可能会遇到的另一种替代方法是.内置的,即
. activate my_env
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
46216 次 |
| 最近记录: |