Shell 脚本执行方式比较 时间: 2019-05-14 17:25 分类: Shell,Linux ####简单需求 使用`unrar`命令批量解压当前目录下的所有`.rar`压缩文件并删除`.rar`压缩包。 ####分析 首先,不考虑使用`unrar x *.rar`方式,实际上我也测试了这个命令,使用手册说是`x`参数来批量解压,但是我这边报错:`No files to extract` 所以还是自己写脚本来解压吧。 ####撸脚本 稍加思索有了下面`Shell`脚本(batchunrar.sh): ```shell #!/bin/bash for line in `ll *.rar | awk '{print $9}'` do unrar e $line rm -f $line done ``` 写完执行如下命令: > chmod +x batchunrar.sh > ./batchunrar.sh 结果报错: ``` ./batchunrar.sh: line 3: ll: command not found ``` 很明显,说`ll`命令找不到,这种问题遇到也不在少数了,就是`PATH`环境变量的问题,但这里不是这个原因,那么我们在当前终端执行`ll`命令为什么又是可以的呢? 这就涉及到了`Shell`脚本几种执行方式的区别了: 1. ./xxxx.sh 方式执行 2. bash xxxx.sh 或者 sh xxxx.sh 方式执行 3. . xxxx.sh 方式执行 4. source xxxx.sh 方式执行 1、2两种方式执行是以新的子进程执行脚本,而上面的`ll`命令实际上在某些`linux`操作系统中是没有的,通常是在`~/.bashrc`或者`/etc/profile`中给`ls`命令取的别名,比如`alias ll='ls -l'`。 所以这两种方式执行上面的脚本会报`ll`命令没有找到(因为新的子进程是没有加载~/.bashrc或者/etc/profile文件的)。 3、4两种方式是以当前 Shell 进程执行的,所以上面的脚本换成这两种方式执行都没有问题。 标签: 无