関数やスクリプトから*実際*(解釈されていない)シェル引数を取得する方法はありますか?

関数やスクリプトから*実際*(解釈されていない)シェル引数を取得する方法はありますか?

posix私はWindowsのGit bashシェルでDOSスタイルパスを通常のUnixスタイルパスに変換する関数を使用しています。 DOSスタイルパスはバックスラッシュを区切り文字として使用するため、シェルがバックスラッシュを使用して次の文字をリテラルとして表示しないように、パスパラメータを引用する必要があります。得る方法はありますか?説明できない私の関数の内部のパラメータなので、引用する必要はありませんか?

役に立つなら、私の機能は次のとおりです。

function posix() {
  echo $1 | sed -e 's|\\|/|g' | sed -re 's|^(.)\:|/\L\1|'
}

(ところで、何でも大歓迎ですコメント引用/シェル解釈のトラブルシューティングに関連しない他の方法で機能を改善するためのヒントもあります。 )

ベストアンサー1

解釈されていないシェルパラメータにはなどが含まれます$1$2ほとんどの場合、パラメータ値の追加の拡張を防ぐには、拡張を二重引用符で囲む必要があります。"$@"すべてのパラメータのリストを提供します。

たとえば、シェルスクリプトの引数を関数に渡すには、次のように呼び出します。

first_argument_as_filename_in_unix_syntax=$(posix "$1")

二重引用符が必要です。を書くと、posix $1最初の引数の値ではなく、最初の引数の値に対してトークン化とワイルドカードを実行した結果が渡されます。また、スクリプトを呼び出すときに正しい参照を使用する必要があります。たとえば、bashで次のように書くとします。

myscript c:\path with spaces\somefile

これにより、解釈されない実際のパラメータは、 と にmyscriptなります。だからしないでください。c:pathwithspacessomefile

あなたのposix機能が間違っています。もう一度二重引用符がないためです$1変数とコマンドの置換は常に二重引用符("$foo"、)で囲まれています"$(foo)"実際、引用符を必要としない例外を覚えておくよりも、この規則を覚えておく方が簡単です。

echo場合によっては、独自の処理を実行し、外部プロセス呼び出しが遅くなります(特にWindowsでは)。 bashで完全なプロセスを実行できます。

posix () {
  path="${1//\\//}"
  case "$path" in
    ?:*) drive="${p:0:1}"; drive="${drive,}"; p="/$drive/${p:2}";;
  esac
  printf %s "$p"
}

jw013で述べたzsh関数あなたが思うようにはなりません。noglobコマンドの前に置くことができ、zshは引数にワイルドカードを割り当てます(ファイル名の生成、つまりワイルドカード拡張など)。たとえば、zshでは、noglob locate *foo*bar*を書くとlocateパラメータを使用して呼び出されます*foo*bar*。通常、エイリアスnoglobの後に組み込み機能を非表示にします。この機能は、実行しようとしている操作とは関係ありません。

おすすめ記事