V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
imherer
V2EX  ›  Linux

sh xx.sh 和 ./xx.sh 有什么区别

  •  
  •   imherer · 2017-09-11 11:40:24 +08:00 · 8716 次点击
    这是一个创建于 2633 天前的主题,其中的信息可能已经有所发展或是发生改变。
    接触 Linux 时间不长,上面这两种方式都能执行 xx.sh 脚本,但是有什么区别呢?
    还有 node 也可以这样 node xx.js 和 node ./xx.js
    20 条回复    2017-09-14 15:03:58 +08:00
    a342191555
        1
    a342191555  
       2017-09-11 11:47:39 +08:00 via iPhone   ❤️ 4
    接触的时间也不长,个人理解,望抛砖引玉:

    sh xx.sh 是调用 sh 这个 shell,根据 xx.sh 的内容执行。

    ./xx.sh 需要首先确定 xx.sh 拥有执行权限(--x ),shell 会根据 xx.sh 的头几行使用相应的 shell 运行

    node xx.js 和 node ./xx.js 区别是前者根据$PATH 寻找 xx.js 的位置,后者是直接在当前位置( pwd )寻找 xx.js 。
    Tink
        2
    Tink  
       2017-09-11 11:51:31 +08:00   ❤️ 1
    补充 ,sh 和 bash 还是有区别的,具体来说 /bin/sh 相当于 /bin/bash --posix
    a342191555
        3
    a342191555  
       2017-09-11 11:57:12 +08:00 via iPhone   ❤️ 1
    @Tink 我以为 sh bash zsh 等分别是不同的 shell,有些许区别…
    Tink
        4
    Tink  
       2017-09-11 12:00:06 +08:00   ❤️ 1
    @a342191555 #3 一般的 linux 上 sh 都是软链接到 bash 的,但是加了 --posix 参数
    zj299792458
        5
    zj299792458  
       2017-09-11 12:02:03 +08:00 via iPhone
    一个手动指定了解释器,一个可以在文件头指定?
    hxsf
        6
    hxsf  
       2017-09-11 12:03:31 +08:00   ❤️ 2
    @a342191555 #1 node xx.js 和 node ./xx.js 没区别,都是在 当前目录找。。。 前者省略了 ./ 而已
    hzqim
        7
    hzqim  
       2017-09-11 12:06:07 +08:00 via Android   ❤️ 1
    区别之一,后者.sh 要有 x 权限,前者可有可无
    a342191555
        8
    a342191555  
       2017-09-11 12:08:54 +08:00 via iPhone
    @hxsf 是的,我弄错了,xx.js 就是传递给 node 的一个参数而已,具体怎么用应该是看 node 了
    seers
        9
    seers  
       2017-09-11 12:26:25 +08:00
    sh 是指定了 shell 来运行脚本 ./就只会用当前 shell 来运行
    a1044634486
        10
    a1044634486  
       2017-09-11 12:33:21 +08:00
    1 楼解释很到位的
    lgpqdwjh
        11
    lgpqdwjh  
       2017-09-11 12:38:24 +08:00   ❤️ 1
    /bin/sh -- > 执行一个脚本文件

    ./xxx 表示一个可执行脚本, 首先它要有可执行权限,而一般而言合格的脚本头部都会有 #! 来标识该执行文件的解释器, 可以是 python 可以是 shell, 然而也不是必须的, 当都没有的情况会调用当前 shell
    zzn
        12
    zzn  
       2017-09-11 12:47:27 +08:00
    虽然没什么关系,第一行写成 `#!/usr/bin/env` , 然后./xxx 试试?
    zzn
        13
    zzn  
       2017-09-11 12:49:03 +08:00
    @zzn 回复不支持 markdown ?忽略``
    Chingim
        14
    Chingim  
       2017-09-11 12:53:45 +08:00
    @seers 不是的, ./会用文件 shebang 指定的 shell 来运行
    DejaVud
        15
    DejaVud  
       2017-09-11 12:54:18 +08:00
    Umix
        16
    Umix  
       2017-09-11 12:59:21 +08:00
    xratzh
        17
    xratzh  
       2017-09-11 14:38:35 +08:00
    sh 命令的话,文件里不用指定解释器就可运行。就是.sh 的第一行那个东西。./需要这一行
    fox0001
        18
    fox0001  
       2017-09-11 21:20:32 +08:00
    大家都解答得差不多了。没事,我就打个酱油
    mingweili0x
        19
    mingweili0x  
       2017-09-12 01:01:37 +08:00
    如果是直接 ./ 执行的话,也不需要指定 shebang。我一直都是写完 shell 脚本,不写 shebang,加一个+x,直接运行。不过可能不是一个好的习惯吧
    codehz
        20
    codehz  
       2017-09-14 15:03:58 +08:00
    @xratzh #17 并不需要,会使用用户默认 shell 执行。。
    @mingweili0x #19 没错,如果用户默认 shell 和你编写的用的不一样的话(比如 bash vs zsh )就有机会炸掉
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3863 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 00:14 · PVG 08:14 · LAX 16:14 · JFK 19:14
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.