./ . 和#!/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 ...
随机推荐
- ubuntu下配置nginx+uwsgi+django
服务器配置是Ubuntu14.04 64位OS ubuntu14.04默认是安装好了python2.7版本不用自己安装了. 先更新下源 sudo apt-get update 第一步先安装pip su ...
- 快捷查看dll的PublicKeyToken
@echo off d: cd D:\Win2003\Microsoft Visual Studio 10.0\VC\ call vcvarsall.bat x86 echo. if not '%1' ...
- iOS UIWebView 之 UIProgressView
之前做等待跳转都是用UIActivityIndicatorView ,后来做webView 加载页面的时候,发现了一个特别好用又超级炫酷的加载提示NJKWebViewProgress,作者巧妙的通过计 ...
- BZOJ 3668: [Noi2014]起床困难综合症( 贪心 )
之前以为xor,or,and满足结合律...然后连样例都过不了 早上上体育课的时候突然想出来了...直接处理每一位是1,0的最后结果, 然后从高位到低位贪心就可以了... 滚去吃饭了.. ------ ...
- keytool 生成 Android SSL 使用的 BKS
我是在Mac(JDK 1.6) 环境下生成的,Windows 也应该通用; 首先要从CA那里申请来签名的证书,我的是crt格式的; 然后使用如下命令,对应的BcProvider 是 bcprov-e ...
- Mirantis OpenStack HA
Mysql使用Galera做Active/Active集群,同时使用Pacemaker,因为Galera mysql用到了领导机选举机制quorum,所以控制节点至少三个 RabbitMQ使用mirr ...
- USACO Healthy Holsteins DFS
使用排列组合,遍历所有可能的情况C(1)+C(2)+C(3)……C(n)= 2^G种组合 数据规模不大,暴力过去最多也就是2^15 = 23768种情况 所以就暴力咯,不过还是Debug了一会 Sou ...
- POJ 1142 质因数分解
只要很朴素的分解就可以了,数据量不大 #include <stdio.h> #include <string.h> #include <stdlib.h> #inc ...
- (Problem 14)Longest Collatz sequence
The following iterative sequence is defined for the set of positive integers: n n/2 (n is even) n 3n ...
- static timing analysis 基础
此博文依据 特权同学在电子发烧友上的讲座PPT进行整理而成. static timing analysis 静态时序分析基础 过约束:有不必要的约束,或者是约束不能再某一情况下满足.——约束过头了 ...