Chr*_*isW 0 permissions executable shell-script windows-subsystem-for-linux
查看我/etc/profile.d目录中的文件:
cwellsx@DESKTOP-R6KRF36:/etc/profile.d$ ls -l
total 32
-rw-r--r-- 1 root root 96 Aug 20 2018 01-locale-fix.sh
-rw-r--r-- 1 root root 1557 Dec 4 2017 Z97-byobu.sh
-rwxr-xr-x 1 root root 3417 Mar 11 22:07 Z99-cloud-locale-test.sh
-rwxr-xr-x 1 root root 873 Mar 11 22:07 Z99-cloudinit-warnings.sh
-rw-r--r-- 1 root root 825 Mar 21 10:55 apps-bin-path.sh
-rw-r--r-- 1 root root 664 Apr 2 2018 bash_completion.sh
-rw-r--r-- 1 root root 1003 Dec 29 2015 cedilla-portuguese.sh
-rw-r--r-- 1 root root 2207 Aug 27 12:25 oraclejdk.sh
Run Code Online (Sandbox Code Playgroud)
这是“适用于 Linux 的 Windows 子系统(WSL)”上的 Ubuntu。
反正内容oraclejdk.sh是这样的:
export J2SDKDIR=/usr/lib/jvm/oracle_jdk8
export J2REDIR=/usr/lib/jvm/oracle_jdk8/jre
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/mnt/c/Program Files/WindowsApps/CanonicalGroupLimited.Ubuntu18.04onWindows_1804.2019.522.0_x64__79rhkp1fndgsc:/snap/bin:/usr/lib/jvm/oracle_jdk8/bin:/usr/lib/jvm/oracle_jdk8/db/bin:/usr/lib/jvm/oracle_jdk8/jre/bin
export JAVA_HOME=/usr/lib/jvm/oracle_jdk8
export DERBY_HOME=/usr/lib/jvm/oracle_jdk8/db
Run Code Online (Sandbox Code Playgroud)
我很确定它会在 bash shell 启动时运行。
我的问题是,为什么不是所有*sh文件都x设置了权限位?不是所有的 shell 脚本都需要设置xperission 位才能执行吗?
请把我当作一个新手。
一个 shell 脚本只需要是可执行的,如果它是作为运行
./scriptname
Run Code Online (Sandbox Code Playgroud)
如果它是可执行的,并且它有一个#!指向正确解释器的有效行,那么该解释器(例如bash)将用于运行脚本。
如果脚本不可执行(但仍然可读),那么它仍然可以从命令行使用显式解释器运行,例如
bash ./scriptname
Run Code Online (Sandbox Code Playgroud)
(如果它是一个bash脚本)。请注意,您必须知道此处使用什么解释器,因为zsh如果使用 运行,脚本可能无法正确执行bash,并且bash如果使用 执行,脚本同样可能会中断sh(就像 Perl 脚本在由 Python 或 Ruby 执行时无法正常工作一样) .
正如您所展示的那样,某些脚本实际上不是脚本而是“点脚本”。这些被设计为来源,如
. ./scriptname
Run Code Online (Sandbox Code Playgroud)
即用作点 ( .) 实用程序的参数,或 (in bash),
source ./scriptname
Run Code Online (Sandbox Code Playgroud)
(两者在 中是等价的bash,但 dot 实用程序更便于携带)
这将在与调用 shell 相同的环境中运行点脚本中的命令,这对于例如在当前环境中设置环境变量是必要的。(正常运行的脚本在子环境中运行,是其父环境的副本,并且不能在其父 shell 中设置环境变量或更改其当前目录。)
点脚本由当前 shell 读取(或“来源”),因此不必是可执行的,只需可读。
我可以说你显示内容的脚本是一个点脚本,因为它没有#!-line(它不需要一个)并且因为它只是导出一堆变量。
我相信我从ksh93shell的手册中选择了术语“点脚本” 。我找不到更权威的来源,但听起来像是用来描述应该使用.命令获取的脚本的好词。
| 归档时间: |
|
| 查看次数: |
195 次 |
| 最近记录: |