Phi*_*ide 13 command-line scripts
为什么有些系统.sh只需要指定文件名而不带扩展名就可以运行文件,而有些系统需要名称加扩展名?就我而言,我正在尝试按照这些说明编写一系列命令。
我现在正在指定扩展名,但能够在没有的情况下运行命令.sh会更好。
wal*_*tor 39
你很困惑。该.sh扩展仅仅是一个暗示人类,对系统处理文件完全没有影响。Unix/Linux 没有让 WindowsSecrets.pdf.exe犯错。
以下是您键入时发生的情况foo:
为STDIN、STDOUT和 的重定向STDERR设置。
外壳检查其内部哈希表,看它是否已经知道一个$PATH入境foo。如果不存在,shell 将搜索 中的目录$PATH,寻找foo在其文件权限中设置了 Execute 位的名为的文件。先foo赢。
如果文件的前两个字节foo是#!,则下一个字符串是要运行的解释器的名称。因此#!/bin/bash引入了 Bash 脚本,#!/usr/bin/perl引入了 Perl 脚本等。
如果文件以 开头\177ELF,则它是一个二进制可执行文件,并ld.so启动它。
阅读man execve并man ld.so获得更详细的解释。
Ser*_*nyy 13
关键是:扩展在任何类 Unix 系统系统中都无关紧要。文件名只是名称,对脚本或编译后的可执行文件是否可以运行没有影响。程序员可能会添加一个.sh扩展名来指定一个文件是 shell 脚本,或者.py是 python 脚本,但与 Windows 不同,任何 unix 都不关心命名,它关心权限。
重要的是授予文件的可执行权限。你可以检查
ls -l /path/to/file
Run Code Online (Sandbox Code Playgroud)
运行脚本一般有几种方法。
./my_script_name。该.指当前目录。/home/user/bin/my_script_name(以上两种方法依赖于设置可执行权限;文件是否是$PATH变量的一部分无关紧要。#!行的存在也很重要;没有它,脚本将由您打开的当前shell执行。如果我有csh脚本如果没有该行,并尝试在 bash 中运行它./my_script.csh,它将失败)
$PATH变量的目录中,您只需调用名称即可运行它。您可以chmod通过键入其名称在命令行中调用命令,因为它位于/bin文件夹中。/bin始终是$PATH变量的一部分。在这种情况下,脚本的可执行权限和位置很重要. filename.sh或source filename.sh将使得脚本进行处理,就好像是键盘输入,也就是说,如果它是直接键入命令行。在这种情况下,可执行权限和位置无关紧要示例 #1,使用解释器运行,以执行权限
$-> ls -l abc.py
-rw-rw-r-- 1 xieerqi xieerqi 44 Apr 27 22:39 abc.py
$-> python abc.py
a
b
c
Run Code Online (Sandbox Code Playgroud)
示例#2,以./可执行权限集运行,shebang 行集。
$-> cat abc.py
#!/usr/bin/env python
for letter in 'a' 'b' 'c' :
print letter
$-> ls -l abc.py
-rwxrwxr-x 1 xieerqi xieerqi 66 Apr 27 23:02 abc.py*
$-> ./abc.py
a
b
c
Run Code Online (Sandbox Code Playgroud)
示例 #3,在没有设置 shebang 行的情况下运行(失败,因为 bash 无法读取 python 脚本;没有 shebang 行假定当前 shell 作为解释器)
$-> cat abc.py
for letter in 'a' 'b' 'c' :
print letter
$-> ./abc.py
./abc.py: 2: ./abc.py: Syntax error: word unexpected (expecting "do")
Run Code Online (Sandbox Code Playgroud)
示例 #4 ,运行具有可执行权限的脚本设置表单文件夹,该文件夹是$PATH变量的一部分
# /home/xieerqi/bin is part of my path variable
$-> echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/opt/microchip/xc16/v1.25/bin:/opt/microchip/xc32/v1.40/bin:/opt/microchip/xc8/v1.35/bin:/home/xieerqi/bin:/home/xieerqi/bin/sh
$-> # current directory is /home/xieerqi
$-> pwd
/home/xieerqi
$-> # move the file to ~/bin
$-> mv ~/abc.py ~/bin/abc.py
$-> # now I can run it just by calling the name
$-> abc.py
/home/xieerqi/bin/abc.py: 2: /home/xieerqi/bin/abc.py: Syntax error: word unexpected (expecting "do")
$-> # Syntax error because again, no interpreter specified.
$-> # must add #!/usr/bin/env python
$-> vi /home/xieerqi/bin/abc.py
$-> # after adding the line with vi text editor, we can run
$-> abc.py
a
b
c
Run Code Online (Sandbox Code Playgroud)
示例 #5,删除扩展,仍然运行,因为扩展无关紧要,但它具有权限并且是 的一部分$PATH:
$-> mv ~/bin/abc.py ~/bin/abc
$-> abc
a
b
c
Run Code Online (Sandbox Code Playgroud)
这里已经有很好的解释了。我只是想补充一点,理想情况下您不应该对可执行文件使用文件扩展名。
通常,您需要完成一些相对容易的事情,并从一个小 shell 脚本开始。随着时间的推移,您开始向脚本添加越来越多的功能,直到某个时间它变得无法维护,或者您需要一些使用 shell 脚本无法轻松完成的功能并考虑用另一种语言(python)重写此 shell 脚本,perl,...?)。
从头开始重写通常被认为是错误的,但对于脚本来说,它可能是有意义的,因为它们通常不是那么大或具有很多功能。但是让我们假设用其他语言从头开始重写是可行的,保留初始 shell 脚本的功能和参数/标志。
此脚本的用户不需要知道这种语言更改,他们将继续执行相同的命令并且它将继续工作。
如果您的脚本名为do-something.sh,则它可以继续为do-something.sh,但现在它是用 python 编写的(例如),因此您最初的提示现在完全是误导性的。
要运行没有扩展名的文件,您通常不需要做太多事情,只需确保(在 bash 脚本的情况下)在第一行有正确的 shebang 行:
#!/bin/bash
Run Code Online (Sandbox Code Playgroud)
那么您还需要通过以下方式使文件对系统可执行
chmod 755 yourfilename
Run Code Online (Sandbox Code Playgroud)
这与使用chmod +x yourfilename数字很容易解释相同。
它是相加的八进制数的三元组,第一个数字代表用户,第二个数字代表组,第三个数字代表其他人,您可以在此处找到更多信息。
如果您与脚本位于同一目录中,请不要忘记./像这样使用:
./yourfilename
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3350 次 |
| 最近记录: |