假如有一个文件test.sh,脚本内容如下:
#!/bin/bash
echo "step 1 sleeping"
sleep 200
echo "step 2 sleeping"
sleep 200
那么,现在按以下4种方式执行:
1)./test.sh
2)sh test.sh
3). test.sh
4)source test.sh
!/bin/
"#!/bin/bash"是指此脚本使用/bin/bash来解释执行。
其中,#!是一个特殊的表示符,其后,跟着解释此脚本的shell路径。"#!/bin/bash"只能放在第一行,如果后面还有#!,那么只能看成是注释
他们有何区别?
1)第一种方式,是在当前的shell执行脚本本身,也就是说把test.sh当成一个文件执行,这时候我们需要拥有test.sh的运行权限(x权限),而且当我们在执行此命令时,有2个新进程在运行,一个是test.sh,一个是sleep,如果我们在执行第一个sleep时按ctrl+c终止脚本,test.sh和sleep一起终止,并且第二个sleep不会执行,因为整个test.sh运行已经终止。
2)第二种方式,是新建一个shell执行test.sh脚本里面的命令,不需要执行权限,有读取权限(r权限)即可,在执行此命令时,有2个新进程在运行,一个是bash,一个是sleep,如果执行第一个sleep时按ctrl+c,bash被终止,结果和第一种方式一样,第二个sleep不会执行。
3)第三种方式,是在当前shell执行test.sh里面的命令,不需要执行权限,有读取权限(r权限)即可,在执行此命令时,只有一个新进程在运行,就是sleep,如果在执行第一个sleep时按ctrl+c终止,那么第二个sleep接着运行,直到脚本所有命令执行完。
4)第四种方式和第三种方式一致。
什么叫 “当作一个文件执行”?
./gulp ZhangBowei@IDream
[10:51:46] Working directory changed to ~/Code/js/test
[10:51:47] Using gulpfile ~/Code/js/test/gulpfile.js
[10:51:47] Starting 'build'...
(node:41167) DeprecationWarning: Using Buffer without `new` will soon stop working. Use `new Buffer()`,or preferably `Buffer.from()`,`Buffer.allocUnsafe()` or `Buffer.alloc()` instead.
source gulp ZhangBowei@IDream
gulp:3: command not found: use strict
gulp:4: unknown group
gulp:5: unknown file attribute: y
gulp:6: number expected
gulp:7: missing end of string
gulp:8: number expected
gulp:9: number expected
gulp:10: unknown file attribute: i
gulp:11: unknown file attribute: i
gulp:12: unknown file attribute: v
总结
从以上可以看出, ./ 会识别 文件中的“#!/usr/bin/env node”类型的语句。 source等“新建一个shell执行test.sh脚本里面的命令” ,只找文件里的shell命令。
另外,./gulp 与 gulp 的区别在于: 前者系统会在本地找文件,后者系统会去全局找(类似 npm 中的 require('./test') 和 require('test')
zsh 里的. 失效?
.: no such file or directory
shell 区别 , bash下可以, 不同shell命令简化原因。
chmod
问题
作为命令执行文件(x):有X权限才能进入文件夹
总结linux下目录和文件的权限区别:
文件:读文件内容(r)、写数据到文件(w)、作为命令执行文件(x)。
目录:读包含在目录中的文件名称(r)、写信息到目录中去(增加和删除索引点的连结)、搜索目录(能用该目录名称作为路径名去访问它所包含的文件和子目录)
具体说就是:
(1)有只读权限的用户不能用cd进入该目录:还必须有执行权限才能进入。(能进入目录,即 该目录的执行权限)
(2)有执行权限的用户只有在知道文件名,并拥有读权利的情况下才可以访问目录下的文件。
(3)必须有读和执行权限才可以ls列出目录清单,或使用cd命令进入目录。
(4)有目录的写权限,可以创建、删除或修改目录下的任何文件或子目录,即使使该文件或子目录属于其他用户也是如此。
此外chmod也可以用数字来表示权限如 chmod 777 file
语法为:chmod abc file
其中a,b,c各为一个数字,分别表示User、Group、及Other的权限。
r=4,w=2,x=1
若要rwx属性则4+2+1=7;
若要rw-属性则4+2=6;
若要r-x属性则4+1=7。
范例:
chmod a=rwx file
和
chmod 777 file
drwx lrwx
chmod能改变权限,-R是目录下所有文件,777就是高权限(读、写、执行)
chmod -R 777 * 意思就是将当前目录下所有文件都给予777权限
这个在服务器里不能随便敲的,不能在根目录下进行此命令,因为有些进程是指定权限(如755、700...)才能运行的...所以会出错.
不可执行
~/Code/js/updateLaodHost/bin(master*) » sudo ./updatelaodhost.js
Password:
sudo: ./updatelaodhost.js: command not found
设置执行权限
chmod a=rwx updatelaodhost.js
命令:chown 用户 目录或文件名
例如:chown qq /home/qq (把home目录下的qq目录的拥有者改为qq用户)
命令:chgrp 组 目录或文件名
例如:chgrp qq /home/qq (把home目录下的qq目录的所属组改为qq组)
chown就是修改 第一列内容的 ,chmod是修改 第3,4列内容的。
用sudo时提示"xxx is not in the sudoers file. This incident will be reported.其中XXX是你的用户名,也就是你的用户名没有权限使用sudo,我们只要修改一下/etc/sudoers文件就行了。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。