2

システム パスを返す短いシェル プログラムがあります。私がやりたいのは、bash エイリアスを使用してそのパスに CD することです。

私の理想のアウトプットは

~$ pwd
    /home/username
~$ mark home
~$ cd /
/$ pwd
    /
/$ place home
~$ pwd
    /home/username

「マーク」部分は機能していますが、「場所」は機能していません。

alias place="cd \"~/marker.sh go $@\";"

私の考えは、の出力にcdしたいということです~/marker.sh go $@

問題は、bash がこれを 1 つのコマンドとして解釈し、エラーが発生することです。

-bash: cd: ~/marker.sh go : No such file or directory
-bash: home: command not found

これは、シェルがエイリアス全体を文字列として解析していることを意味すると思います。

エイリアス $() や `` などのシェル スクリプト部分をさまざまな形で引用してみましたが、bash の起動時にスクリプトを実行しようとするか、まったく実行せずに文字列のままです。

私は主に bash コマンドを学習するためにこれをプログラミングしていますが、この 1 つの部分がわかりません!

それが重要な場合、iTerm 1.0.0.20130624 で OSX 10.9 を実行しています。

編集:スクリプト内で cd が機能しないことを理解しています。そのため、プログラムを使用して正しいパスを返し、組み込みのエイリアス システムを使用してディレクトリを実際に変更しようとしています。

4

2 に答える 2

2

エイリアスではなく、関数が必要です。

place () {
    cd $( ~/marker.sh go "$@" )
}

エイリアスは引数を取りません。それらは単純にその場で展開され、エイリアスが展開された後に引数が発生します。

(関数が目的の処理に適応できない場合を除き、常にエイリアスよりも関数を優先する必要があります。)

于 2013-10-28T18:15:14.307 に答える
2

エイリアスや外部 bash スクリプトではなく、関数を使用してください。

あなたの、.bashrcまたはそれによってソースされたファイル、または手動でソースするファイルに、この完全に使用可能なスクリプトを入れてください!

declare -A _mark_dir_hash

mark() {
   [[ -z $1 ]] && { listmarks; return 0; }
   if [[ -n ${_mark_dir_hash[$1]} ]] && [[ $1 != ${_mark_dir_hash[$1]} ]]; then
       echo "Mark $1 was already set to ${_mark_dir_hash[$1]}... replaced with new mark"
   fi
   _mark_dir_hash[$1]=$(pwd)
}

place() {
   [[ -z $1 ]] && { echo >&2 "You must give a mark name to go to!"; return 1; }
   [[ -z ${_mark_dir_hash[$1]} ]] && { echo >&2 "Mark $1 unknown!"; return 1; }
   cd "${_mark_dir_hash[$1]}"
}

listmarks() {
   [[ -z ${!_mark_dir_hash[@]} ]] && { echo "No marks!"; return 0; }
   for i in "${!_mark_dir_hash[@]}"; do
      printf '%s --> %s\n' "$i" "${!_mark_dir_hash[@]}"
   done
}

removemark() {
   [[ -z $1 ]] && { echo >&2 "You must give a mark name to remove!"; return 1; }
   unset _mark_dir_hash[$1]
}

clearmarks() {
   _mark_dir_hash=()
}

ハ、あなたが Mac を使用していることに気付いたので、連想配列をサポートしていない古いバージョンの bash を使用している可能性があります。残念だね。それでも、これは最新のシェルを使用している他の人々にとって役立つかもしれません!

于 2013-10-28T18:41:34.360 に答える