./ . 和#!/bin/bash 辨析Linux如何选择当前执行脚本的shell
来源:互联网 发布:linux 超级用户登录 编辑:程序博客网 时间:2024/06/08 16:03
最近遇到一个有趣的问题,让我搞清楚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 operatorUsage: 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 shell脚本 #!/bin/sh和$bash
- bash shell 获取当前正在执行脚本的绝对路径
- bash shell 获取当前正在执行脚本的绝对路径
- Bash如何取得当前正在执行的脚本的绝对路径?
- Bash如何取得当前正在执行的脚本的绝对路径?
- [shell]Linux脚本开头#!/bin/bash和#!/bin/sh是什么意思以及区别
- Linux Shell基础-脚本执行方式和Bash基本功能
- Linux shell脚本中#! /bin/bash 与 #! /bin/sh 的区别
- Shell-/bin/bash和/bin/sh解释器的误用引起的脚本语法错误
- shell脚本中#!/bin/bash
- Linux shell脚本执行方式:source、sh、bash、./执行脚本的区别
- [转]linux shell 获取当前正在执行脚本的绝对路径
- linux shell 获取当前正在执行脚本的绝对路径
- linux shell 获取当前正在执行脚本的绝对路径
- linux shell 获取当前正在执行脚本的绝对路径
- linux shell 获取当前正在执行脚本的绝对路径
- linux shell 获取当前正在执行脚本的绝对路径
- 松耦合(Loose coupling)笔记
- Android、iOS和Windows Phone中的推送技术
- 大数阶乘
- 华为2013机试题
- error :“No source available for main()” when debugging by eclipse cdt
- ./ . 和#!/bin/bash 辨析Linux如何选择当前执行脚本的shell
- Oracle Database 10g 未在当前操作系统中经过认证
- 图像处理与识别学习小结
- (SQL SERVER) (ORACLE) (ACCESS)(POSTGRE SQL)四种数据库操作C#代码
- JSTL标签急速秒杀jsp页面中的java代码---自定义函数
- ios开源项目列表
- GPSR协议移植
- 编码问题
- hdu4710