./ . 和#!/bin/bash 辨析Linux如何选择当前执行脚本的shell
最近遇到一个有趣的问题,让我搞清楚Linux如何选择当前执行脚本的shell
执行cts的的 media stress test 需要安装 android-cts-media-1.0.zip
把这个文件解开,发现有一个 copy_media.sh 脚本,就是用 adb push 向 android devices 复制文件,很简单的一个脚本,执行起来却有错
$./copy_media.sh 1920x1080
1920x1080
./copy_media.sh: 22: [: 1920x1080: unexpected operator
./copy_media.sh: 25: [: 1920x1080: unexpected operator
./copy_media.sh: 28: [: 1920x1080: unexpected operator
./copy_media.sh: 31: [: 1920x1080: unexpected operator
./copy_media.sh: 34: [: 1920x1080: unexpected operator
Usage: copy_media.sh [720x480|1280x720|1920x1080] [-s serial]
for testing up to 1280x720, copy_media.sh 1280x720
default resolution, when no argument is specified, is 480x360
copy_media.sh all will copy all the files.
但如果我用
$. copy_media.sh 1920x1080
执行就没有问题, 为何?我的猜想是:
./ 是用 /bin/sh 执行 copy_media.sh , 它比较”原始“,因此解释不了 其中的 if [ ... ] 语句. 用 . 就是在当前的 bash 下执行,所以成功了。
下面验证我猜想是否正确
我用 $env | grep SHELL输出是bash,那为何 copy_media.sh 是用 /bin/sh 执行
SHELL=/bin/bash
再看文件开始部分,真相大白,原来 copy_media.sh 指定用 /bin/sh执行
head copy_media.sh
#!/bin/sh
# Copyright (C) 2012 The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
而用 . (就是 source 命令) 绕开了 #!/bin/sh;另一种方法是删除这行,就会使用$SHELL变量执行的shell;当然改成
#!/bin/bash 也可以解决问题。
总结:
Linux 解释脚本按使用 shell 的顺序是
1) 脚本第一行中 #!指定
2) 没有指定就使用 $SHELL
而使用 . 就是在当前 shell 中执行,当然就不会关注 !#/bin/sh 中的指定了.
./ . 和#!/bin/bash 辨析Linux如何选择当前执行脚本的shell的更多相关文章
- [转帖]Linux /tmp目录下执行脚本失败提示Permission denied
Linux /tmp目录下执行脚本失败提示Permission denied https://www.cnblogs.com/linyfeng/p/11087655.html 国产化的环境上 就有一个 ...
- Linux下设置定期执行脚本
下面针对的是非ubuntu环境,会在文章末尾介绍ubuntu的一些区别. 在Linux下,经常需要定期的执行一些脚本从而来实现一些功能. 在Linux下我们用crontab来实现定期的执行脚本这个功能 ...
- UNIX/Linux系统管理技术手册(1)----脚本和shell
1. 管道和重定向 (i) 要让第二条命令只有在第一条命令成功完成之后才执行,可以用一个 && 符号把两条命令隔开.例如: $ > /dev/null && cd ...
- linux设置crontab定时执行脚本备份mysql
前言:mysqldump备份数据库命令 mysqldump -u root -psztx@2018 fengliuxiaosan > /dbbackup/fengliuxiaosan.sql## ...
- Linux开机启动时执行脚本的方法
方法 1 – 使用 rc.local利用 /etc/ 中的 rc.local 文件在启动时执行脚本与命令.我们在文件中加上一行来执行脚本,这样每次启动系统时,都会执行该脚本.不过我们首先需要为 /et ...
- linux crontab设置定期执行脚本
Linux下crontab命令的用法 任务调度的crond常驻命令crond 是linux用来定期执行程序的命令.当安装完成操作系统之后,默认便会启动此任务调度命令.crond命令每分锺会定期检查是否 ...
- Linux中计划任务执行脚本crontab-简洁版
我使用的是ubuntu16,所以在ubuntu中一切正常,在其他linux系统中应该都差不多. 1 计划任务,crontab命令选项: -u指定一个用户, -l列出某个用户的任务计划, ...
- linux中计划任务执行脚本
我使用的是ubuntu14.4,所以在ubuntu中一切正常,在其他linux系统中应该都差不多. 1 计划任务,crontab命令选项: -u指定一个用户, -l列出某个用户的任务计 ...
- linux shell中的 #!/bin/bash
#!/bin/bash是指此脚本使用/bin/bash来解释执行. 其中,#!是一个特殊的表示符,其后,跟着解释此脚本的shell路径. bash只是shell的一种,还有很多其它shell,如:sh ...
随机推荐
- poj 1715 Hexadecimal Numbers 排列组合
/** 大意: 给定16进制数的16个字母,,求第k大的数,,要求数的长度最大为8.,并且每个数互不相同. 思路: 从高到低挨个枚举,每一位能组成的排列数 ,拿最高位来说,能做成的排列数为15*A(1 ...
- 腾讯地图之Marker
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...
- 基于原生js的图片延迟加载
当页面图片比较多的时候,我们通常会做一个延迟加载,避免页面打开时一下子的请求数太多,加载过慢影响用户体验. 如果项目用了jquery框架,则可以直接用 jquery.lazyload.可在jquery ...
- hibernate的配置 1
hibernate 是一种ORM框架,是ORM框架中一个典范 ORM叫做对象关系映射 是面向对象语言和关系型数据库之间的映射关系 所以只有在面向对象语言或者关系型数据库没用的时候ORM才会消失 ORM ...
- Nginx日志增长过快详细分析
前言: Nginx日志里面Mobileweb_access.log增长特别大,一天上百兆,将近100W的访问记录,按照我们目前的规模,热点用户才500个左右,就算人人用手机app访问,怎么可能会有这么 ...
- FLASH ROM与EEPROM的区别
EEPROM,虽然也叫“非易失性数据存储器”,但它不能直接参与ALU运算,只是用于掉电不丢失的数据存储. EEPROM和片内RAM 类似,也属于数据存储器,它的特点是数据掉电可保持,而程序存储器一般指 ...
- Hibernate级联操作和载入机制(二) cascade and fetch
上一篇介绍了Hibernate持久化对象时候的级联操作.本篇介绍读取时候的级联操作. 还是用上一篇的样例.一份问卷有多个问题.可是每一个问题仅仅能属于一份问卷. 我们先看測试用例: @Test pub ...
- javascript得知 - js的Date对象函数
js的Date功能很强大.通常使用. 首先获得当前的日期: var CurDate = new Date(); var Year = CurDate.getFullYear(); //年份(四位 例: ...
- 【Eclipse】WebServiceExplorer
1.点击以下按钮启动Eclipse Web Service Explorer 2.点击页面右上角的WSDL PAGE按钮 3.点击页面左上角WSDL MAIN-->输入WSDL地址-->选 ...
- 永久性for循环配合switch语句可以实现菜单功能
永久性for循环配合switch语句可以实现菜单功能总结:加入想要无条件地跳转到某条语句执行,用goto语句: 加入想要对某种条件进行判断,为真或为假分别执行不同的语句,用if语句 加入想要检测的条件 ...