通常使用shell去运行脚本,两种方法 :
bash xxx.sh
bash -c "cmd string"
对于bash xxx.sh
, 首先bash 会在当前目录去寻找xxx.sh
,如果找到,就直接运行,找不到则按照环境变量$PATH
的指定路径,按顺序去找,如果找到,则执行,找不到则报错。
shell脚本的参数$0
就是要执行的shell脚本xxx.sh
, $1
就是后面紧跟xxx.sh
的参数,$2
,$3
依次类推
如果用bash -c
那么bash
会从第一个非选项参数后面的字符串中读取命令,如果字符串有多个空格,第一个空格前面的字符串是要执行的命令,也就是$0
, 后面的是参数,即$1
,$2
….
使用bash -c 要注意两点
-c 第一个字符串一定要是命令路径,不能是文件名,如果把./atest前面的./去掉,那么就会报找不到命令
命令文件必须要有可执行权限,即./atest 的必须就有x属性
个人理解bash -c “./atest hello world”实际上和./atest hello world等价
bash -c
先说说sh -c
吧,sh
, 其实就是bash
命令.
-c
的意思是 command,所以 bash -c
后面应该跟一个 command。
用法:
bash -c "cmd string"
[Mb18@login ~]$ which sh
/usr/bin/sh
[Mb18@login ~]$ ll /usr/bin/sh
lrwxrwxrwx 1 root root 4 Jan 17 2019 /usr/bin/sh -> bash
xargs
管道实现的是将前面的stdout作为后面的stdin,但是有些命令不接受管道的传递方式,最常见的就是ls命令。
有些时候命令希望管道传递的是参数,但是直接用管道有时无法传递到命令的参数位,这时候需要xargs,xargs实现的是将管道传输过来的stdin进行处理然后传递到命令的参数位上。
也就是说xargs完成了两个行为:处理管道传输过来的stdin;将处理后的传递到正确的位置上。
xargs的作用不仅仅限于简单的stdin传递到命令的参数位,它还可以将stdin或者文件stdin分割成批,每个批中有很多分割片段,然后将这些片段按批交给xargs后面的命令进行处理。
通俗的讲就是原来只能一个一个传递,分批可以实现10个10个传递,每传递一次,xargs后面的命令处理这10个中的每一个,处理完了处理下一个传递过来的批,如下图。
image.png
- xargs提供了"-P"选项,用于指定并行执行的数量(默认只有一个处理进程,不会提升效率,可以指定为N个子进程,或者指定为0表示尽可能多地利用CPU),这样就能让分批操作更好地利用多核cpu,从而提升效率。例如上面分成了两批,指定"-P 2"可以并发执行这两个批
- 剩下的就是处理xargs的细节问题了,比如如何分割(xargs、xargs -d、xargs -0),分割后如何划批(xargs -n、xargs -L),参数如何传递(xargs -i)。另外xargs还提供询问交互式处理(-p选项)和预先打印一遍命令的执行情况(-t选项),传递终止符(-E选项)等。
网友评论