$ PATHで$ 0を使用してスクリプトを実行するにはどうすればよいですか?

$ PATHで$ 0を使用してスクリプトを実行するにはどうすればよいですか?

ソフトリンクを生成したスクリプト(~/.../gremlin)があります。

ln -s ~/[...]/gremlin ~/sc/gremlin

~/sc/gremlinはい$PATH
スクリプトを直接呼び出すだけです。
リンク経由で呼び出すとそうではありません。
使用するのでdirname $0何も得られません。

スクリプトを変更せずにソフトリンクを置き換える別のスクリプトを作成せずにこの設定を機能させる方法はありますか?

$0 の使い方は次のとおりです。

case `uname` in
  CYGWIN*)
    CP=$( echo `dirname $0`/../lib/*.jar . | sed 's/ /;/g')
    ;;
  *)
    CP=$( echo `dirname $0`/../lib/*.jar . | sed 's/ /:/g')
esac

答え1

使用にdirname $0問題があるかどうかどのように使用されます。詳細がなければ、この質問に答えることはできません。

(a)使用法にdirname $0問題があり、(b)スクリプトを変更できない場合、回避策は~/sc/gremlinソフトリンクをスクリプトに置き換えることです。

#!/bin/sh
exec ~/../gremlin "$@"

これは~/../gremlin正しい方法で実行されます$0

使用は、execスクリプトを実行するプロセスが~/../gremlin実行中のプロセスを置き換えるという意味です~/sc/gremlin。これは~/../gremlin、完了するまで両方のプロセスを保持するよりも効率的です。

答え2

スクリプト内ではなく~/...ディレクトリから派生したい場合は、次のことができます。$0~/sc

zshスクリプトの場合:

#! /bin/zsh -
dir=$0:A:h

readlinkそれ以外の場合は、GNUに似たコマンドがあるとします(一部のシステムにはrealpath使用可能なコマンドがあります)。

#! /bin/sh -
dir=$(dirname -- "$(readlink -f -- "$0")")

readlink -fそして$0:Aあなたにモデルファイルパス、つまりすべてのパスコンポーネントのすべてのシンボリックリンクを確認した後の絶対パス。

それから:

set -- "$dir"/../lib/*.jar .
case $(uname) in
  CYGWIN*) IFS=';';;
  *)       IFS=:;;
esac
CP="$*"

または:

case $(uname) in
  CYGWIN*) sep=';';;
  *)       sep=:;;
esac
CP=$(printf "%s$sep" "$dir"/../lib/*.jar).

答え3

@john1024が指摘したように、OP質問のタイプミスは質問の要点かもしれません。

ln -s ~/.../gremlin ~/sc/gremlin

一部のアプリケーションは3つのポイントをサポートしていますが、Unixファイルシステムはサポートしていません。あなたのシェル代わりに拡張~(チルダ)lnするので

    ln -s ~/../gremlin ~/sc/gremlin

パス名は期待どおりに拡張されます。リンクがすでに存在する場合は、オプションを使用して上書きできます-f。ただし、ターゲットが物理ファイルの場合、この-fオプションはシンボリックリンクでファイルを自動的に上書きします。-i少なくとも何かがすでに存在することを知らせるオプションを使用したいかもしれません。

このオプションは、リンクを確認したい場合に便利です(リンクがファイルを指していることを証明する-Lls

ls -lL ~/sc/gremlin

ファイルでない場合ls(実装によっては)lタイプ(リストの最初の文字)、許可ビットを含む疑問符)、または実際のファイルを指していないことを示す他の表示のみが表示されます。 (この場合、OSXはシンボリックリンクの合計サイズを計算しますが、何も表示しません。)

追加資料:

関連情報