Mac进阶:chmod chgrp #!/bin/作用 sh、source、.sh区别

前端之家收集整理的这篇文章主要介绍了Mac进阶:chmod chgrp #!/bin/作用 sh、source、.sh区别前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

假如有一个文件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权限才能进入文件夹

@H_301_2@

总结linux下目录和文件的权限区别:

文件:读文件内容(r)、写数据到文件(w)、作为命令执行文件(x)。

目录:读包含在目录中的文件名称(r)、写信息到目录中去(增加删除索引点的连结)、搜索目录(能用该目录名称作为路径名去访问它所包含的文件和子目录)

@H_301_2@

具体说就是:

(1)有只读权限的用户不能用cd进入该目录:还必须有执行权限才能进入。(能进入目录,即 该目录的执行权限)
(2)有执行权限的用户只有在知道文件名,并拥有读权利的情况下才可以访问目录下的文件
(3)必须有读和执行权限才可以ls列出目录清单,或使用cd命令进入目录。
(4)有目录的写权限,可以创建、删除修改目录下的任何文件或子目录,即使使该文件或子目录属于其他用户也是如此。

@H_301_2@

此外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  
@H_301_2@

drwx lrwx

l 链接文件
d 块设备文件

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

@H_301_2@

使用chown命令可以修改文件或目录所属的用户

命令:chown 用户 目录或文件

例如:chown qq /home/qq (把home目录下的qq目录的拥有者改为qq用户)


@H_301_2@

使用chgrp命令可以修改文件或目录所属的组:

命令: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文件就行了。

猜你在找的程序笔记相关文章