【问题标题】:Get Caller Absolute Path - Bash Mac OS X Leopard获取调用者绝对路径 - Bash Mac OS X Leopard
【发布时间】:2009-09-23 15:48:13
【问题描述】:

我正在 Mac OS X Leopard 上的应用程序包中运行 jar 文件。我需要向 jar 中传递一个参数。该参数是调用应用程序包的文件的绝对路径。我在下面有我的简短 bash 脚本。我知道 $0 给出了应用程序包本身的绝对路径。

有谁知道如何在变量中存储我需要的路径(下面的 CALLERPATH)?如果另一个脚本调用它,列出的当前脚本可以正常工作(在 Dennis 的回复中查找调用者脚本),但当我双击“file.xyz”时,它的工作方式不同。

脚本 1

#!/bin/bash
echo $0
echo $_
echo $(dirname $0)
echo $(basename $0)
echo $PWD
echo "$@"
echo $PPID
echo "My PPID echo"
myPPID=$PPID echo $(ps -p $myPPID -o args=)
BASEDIR=`dirname "$0"`
echo "CallerPath Output 1"
callerpath="$(/bin/ps -p $PPID -o args=)"
echo -e "$callerpath\n"
echo "Caller Path Output 2"
callerpath="${callerpath#/bin/bash *}"
echo -e "$callerpath\n"
echo "Final Caller Path"
callerpath="${callerpath%/*}"
echo -e "$callerpath\n"
exec java \
-jar "$BASEDIR/../Resources/Java/myJar.jar" "$callerpath"

输出 1

9/25/09 3:54:42 PM [0x0-0xbb0bb].MyApp[1496] /Applications/appBundle.app/Contents/MacOS/myScript
9/25/09 3:54:42 PM [0x0-0xbb0bb].MyApp[1496] /Applications/appBundle.app/Contents/MacOS/myScript
9/25/09 3:54:42 PM [0x0-0xbb0bb].MyApp[1496] /Applications/appBundle.app/Contents/MacOS 
9/25/09 3:54:42 PM [0x0-0xbb0bb].MyApp[1496] myScript
9/25/09 3:54:42 PM [0x0-0xbb0bb].MyApp[1496] / 
9/25/09 3:54:42 PM [0x0-0xbb0bb].MyApp[1496] -psn_0_766139 
9/25/09 3:54:42 PM [0x0-0xbb0bb].MyApp[1496] 63 
9/25/09 3:54:42 PM [0x0-0xbb0bb].MyApp[1496] My PPID echo 
9/25/09 3:54:42 PM [0x0-0xbb0bb].MyApp[1496] ps: Invalid process id: -o 
9/25/09 3:54:42 PM [0x0-0xbb0bb].MyApp[1496] ps: illegal argument: args= 
9/25/09 3:54:42 PM [0x0-0xbb0bb].MyApp[1496] usage: ps [-AaCcEefhjlMmrSTvwXx] [-O fmt | -o fmt] [-G gid[,gid...]] 
9/25/09 3:54:42 PM [0x0-0xbb0bb].MyApp[1496]           [-g grp[,grp...]] [-u [uid,uid...]] 
9/25/09 3:54:42 PM [0x0-0xbb0bb].MyApp[1496]           [-p pid[,pid...]] [-t tty[,tty...]] [-U user[,user...]] 
9/25/09 3:54:42 PM [0x0-0xbb0bb].MyApp[1496]        ps [-L] 
9/25/09 3:54:42 PM [0x0-0xbb0bb].MyApp[1496] CallerPath Output 1 
9/25/09 3:54:42 PM [0x0-0xbb0bb].MyApp[1496] Caller Path Output 2 
9/25/09 3:54:42 PM [0x0-0xbb0bb].MyApp[1496] Final Caller Path

脚本 2

#!/bin/bash
echo $0
echo $_
echo $(dirname $0)
echo $(basename $0)
echo $PWD
echo "$@"
echo $PPID
echo "My PPID export"
export myPPID=$PPID
echo $(ps -p $myPPID -o args=)
BASEDIR=`dirname "$0"`
echo "CallerPath Output 1"
callerpath="$(/bin/ps -p $PPID -o args=)"
echo -e "$callerpath\n"
echo "Caller Path Output 2"
callerpath="${callerpath#/bin/bash *}"
echo -e "$callerpath\n"
echo "Final Caller Path"
callerpath="${callerpath%/*}"
echo -e "$callerpath\n"
exec java \
-jar "$BASEDIR/../Resources/Java/myJar.jar" "$callerpath"

输出 2

9/25/09 4:02:40 PM [0x0-0xc10c1].MyApp[1561] /Applications/appBundle.app/Contents/MacOS/myScript
9/25/09 4:02:40 PM [0x0-0xc10c1].MyApp[1561] /Applications/appBundle.app/Contents/MacOS/myScript
9/25/09 4:02:40 PM [0x0-0xc10c1].MyApp[1561] /Applications/appBundle.app/Contents/MacOS 
9/25/09 4:02:40 PM [0x0-0xc10c1].MyApp[1561] myScript
9/25/09 4:02:40 PM [0x0-0xc10c1].MyApp[1561] / 
9/25/09 4:02:40 PM [0x0-0xc10c1].MyApp[1561] -psn_0_790721 
9/25/09 4:02:40 PM [0x0-0xc10c1].MyApp[1561] 63 
9/25/09 4:02:40 PM [0x0-0xc10c1].MyApp[1561] My PPID export 
9/25/09 4:02:40 PM [0x0-0xc10c1].MyApp[1561] CallerPath Output 1 
9/25/09 4:02:40 PM [0x0-0xc10c1].MyApp[1561] Caller Path Output 2 
9/25/09 4:02:40 PM [0x0-0xc10c1].MyApp[1561] Final Caller Path 

【问题讨论】:

    标签: bash path jar parameters


    【解决方案1】:

    我有一台 Mac,所以我不能使用 $(readlink -f $0) 技巧。这是我的解决方案,由于我手边没有 Linux 机器,请针对您的系统进行测试:

    # Get absolute path of the script
    dir=`dirname $0`            # The directory where the script is 
    pushd "$dir" > /dev/null    # Go there
    CALLERPATH=$PWD             # Record the absolute path
    popd > /dev/null            # Return to previous dir
    
    echo $CALLERPATH
    

    它是如何工作的?

    策略是 1) 获取目录名,2) cd 到它,3) 记录 $PWD,它总是以绝对路径格式。

    【讨论】:

    • 我也没有 Linux 系统,我在 Mac OS X Leopard 上运行这个脚本。如果你将 $0 压入堆栈并导航到那里,然后存储 $PWD,你只需再次获得 app bundle 的目录。我需要调用应用程序包的文件的路径。
    【解决方案2】:

    这有点杂乱无章,但这里是:

    首先,您的标签包括“bash”,但您的 shebang 是针对 /bin/sh。我假设是 Bash。

    第一个调用者:

    #!/bin/bash
    /home/username/dirONE/calltest a b c
    

    下一次调用测试:

    #!/bin/bash
    # echo some stuff to get our bearings
    echo $0
    echo $_                                  # should be the same as $0
    echo $(dirname $0)
    echo $(basename $0)
    echo $PWD
    echo "$@"
    echo $PPID                               # parent process ID
    # start making $callerpath, if there are spaces in a dirname or script name, they should be preserved
    callerpath="$(ps -p $PPID -o args=)"     # get the command name of the parent (it may have args after it)
    callerpath="${callerpath#/bin/bash *}"   # strip /bin/bash from the beginning
    callerpath="${callerpath%/*}"            # like dirname, but removes the args, too
    echo "$callerpath"
    

    现在运行测试:

    $ cd /home/username/dirTHREE
    $ /home/username/dirTWO/caller 1 2 3
    /home/username/dirONE/calltest
    /home/username/dirONE/calltest
    /home/username/dirONE
    calltest
    /home/username/dirTHREE
    a b c
    32674
    /home/username/dirTWO
    

    【讨论】:

    • 这个测试代码只返回一个“/”字符作为我的调用者路径。我不知道为什么,因为我不熟悉所有的 bash 语法
    • ps -p $PPID -o args= 产生什么(在“calltest”脚本中单独包含一行)?
    • 我最初尝试将“callpath=”行复制到我的上述脚本中。但是当我在你写你的帖子时运行它时,作为两个脚本,它给了我“:command not foundltest:第9行:”......也许有语法错误?你是否假设这是一个调用包的脚本?作为澄清,我的应用程序包是从我自己注册的文件扩展名的文件中调用的。所以我双击“file.xyz”,启动管理器知道我的应用程序是所有者,并给了我该文件的绝对路径。我不知道mac如何处理那个路径(windows中的“open”命令通常有“%1”作为abs路径)。
    • 我删除了 cmets 等,所以错误行是 ps -p $PPID -o args=
    • $PWD 放在我上面的脚本中返回“/”...可能是因为我的应用程序包位于 /Applications 中。 "$@" 返回 "-psn_0_",最后一个下划线后带有一个随机数。 $PPID 不会在屏幕上回显任何内容。
    猜你喜欢
    • 2016-04-11
    • 2011-04-04
    • 1970-01-01
    • 2022-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多