ソフト リンクを作成したスクリプト (~/.../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
いくつかのアプリケーションはトリプルドットを尊重しますが、Unixファイルシステムはそうではありません。シェル~
は(チルダ)を展開しますが、ln
は展開しません。
ln -s ~/../gremlin ~/sc/gremlin
は、パス名を期待どおりに展開します。リンクがすでに存在する場合は、 オプションを使用して上書きできます-f
。ただし、ターゲットが実際のファイルの場合、オプションはシンボリック リンクでファイルを暗黙的に上書きします。少なくとも、すでに何かが存在することを通知する オプション-f
を使用することをお勧めします。-i
リンクを検証したい場合(リンクがファイルを指していることを証明したい場合)、-L
次のオプションls
が便利です。
ls -lL ~/sc/gremlin
ファイルでない場合は、ls
(実装に応じて)l
タイプ(リストの最初の文字)として が表示され、パーミッション ビットとして疑問符が表示されるか、実際のファイルを指していないことを示すその他の表示が表示されます(OSX は、この場合、シンボリック リンクのサイズを合計に含めますが、何も表示しません)。
参考文献:
- トリプルドットワイルドカード
- … (3 つのドット) を使用して祖先ディレクトリを参照する機能はどうなりましたか?
- 4.5.1 省略記号ワイルドカード文字(1980 年代の VMS の機能)