V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
otmb
V2EX  ›  程序员

linux shell 文件如何知道自身位置?

  •  
  •   otmb · 2015-01-13 15:06:34 +08:00 · 3113 次点击
    这是一个创建于 3392 天前的主题,其中的信息可能已经有所发展或是发生改变。

    a.sh

    path=xxx

    经常使用source xxpath/a.sh 调用a.sh
    在a.sh中如何获取自身所在文件夹路径呢?

    20 条回复    2015-01-13 17:22:58 +08:00
    eamars
        1
    eamars  
       2015-01-13 15:13:04 +08:00
    cd "$(dirname "$0")"
    gamecreating
        2
    gamecreating  
       2015-01-13 15:16:53 +08:00
    pwd
    otmb
        3
    otmb  
    OP
       2015-01-13 15:17:57 +08:00
    @eamars 通过source a.sh,这种方法不能获取文件所在的路径
    eamars
        4
    eamars  
       2015-01-13 15:23:05 +08:00
    bellchu
        5
    bellchu  
       2015-01-13 15:26:09 +08:00
    realpath
    otmb
        6
    otmb  
    OP
       2015-01-13 15:35:28 +08:00
    @bellchu 不行
    bellchu
        7
    bellchu  
       2015-01-13 15:47:42 +08:00
    @otmb readlink呢? 有的系统可能没有realpath命令
    otmb
        8
    otmb  
    OP
       2015-01-13 15:49:02 +08:00
    @bellchu 通过source调用脚本,不行的
    bellchu
        9
    bellchu  
       2015-01-13 16:01:19 +08:00
    @otmb

    SCRIPTPATH=`realpath`
    otmb
        10
    otmb  
    OP
       2015-01-13 16:13:10 +08:00
    @eamars bash中好像$0无论何种情况都等于$_的?
    otmb
        11
    otmb  
    OP
       2015-01-13 16:13:58 +08:00
    @bellchu
    source xxx/a.sh
    你所得到的path是当前目录,而不是a.sh所在路径
    Beebird
        12
    Beebird  
       2015-01-13 16:20:29 +08:00
    #!/bin/env bash
    ...
    LOCATION=$(pwd)
    #echo $LOCATION
    ...
    otmb
        13
    otmb  
    OP
       2015-01-13 16:34:44 +08:00
    @Beebird source 不行的
    lululau
        14
    lululau  
       2015-01-13 16:39:18 +08:00
    zsh 测试通过:

    ➜ cat test.sh
    dir=`(cd "$(dirname "$0")"; pwd)`

    ➜ 2.2.0 ~/tmp
    ➜ source test.sh

    ➜ 2.2.0 ~/tmp
    ➜ echo $dir
    /Users/liuxiang/tmp
    otmb
        15
    otmb  
    OP
       2015-01-13 16:42:42 +08:00
    @lululau 为啥不用bash?
    lululau
        16
    lululau  
       2015-01-13 16:44:10 +08:00
    @otmb zsh 功能比 bash 丰富很多
    lululau
        17
    lululau  
       2015-01-13 16:45:04 +08:00
    @otmb bash 测试也没问题啊
    Beebird
        18
    Beebird  
       2015-01-13 16:52:38 +08:00
    @otmb 试了可以啊,不论是source还是直接运行。

    cat testpwd.sh

    #!/bin/env bash

    LOCATION=$(pwd)
    echo $LOCATION


    $ source testpwd.sh
    /home/lzhao/tmp
    HowardMei
        19
    HowardMei  
       2015-01-13 17:09:34 +08:00
    sh和bash下面source和直接执行需要的判断参数不同,从"$_" "$0" "$BASH_SOURCE"三个里面找,如果是curl或cat script.sh | bash方式,
    这三个都没用,参考:
    https://github.com/HowardMei/shbin/blob/master/shbin/shsrc
    KentY
        20
    KentY  
       2015-01-13 17:22:58 +08:00
    我是这么弄的,也判断link的情况,readlink读真实dir

    https://github.com/sk1418/passwdmanager/blob/master/start.sh
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5756 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 02:36 · PVG 10:36 · LAX 19:36 · JFK 22:36
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.