
ソフトリンクを生成したスクリプト(~/.../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
少なくとも何かがすでに存在することを知らせるオプションを使用したいかもしれません。
このオプションは、リンクを確認したい場合に便利です(リンクがファイルを指していることを証明する-L
)ls
。
ls -lL ~/sc/gremlin
ファイルでない場合ls
(実装によっては)l
タイプ(リストの最初の文字)、許可ビットを含む疑問符)、または実際のファイルを指していないことを示す他の表示のみが表示されます。 (この場合、OSXはシンボリックリンクの合計サイズを計算しますが、何も表示しません。)
追加資料:
- 3点のワイルドカード
- ...(3点)を使用して親ディレクトリを参照する機能はどうなりましたか?
- 4.5.1省略記号ワイルドカード(1980年代VMSの特徴)