Bash機能は、空白のあるディレクトリを許可しないようです。

Bash機能は、空白のあるディレクトリを許可しないようです。

次の関数を作成しました~/.bashrc

function cl {cd $1; echo $1; ls -al $1}

(実際に読む内容を確認するためにechoコマンドをそこに入れました)

私のホームディレクトリに「samplesフォルダ」というフォルダを作成し、cl "example folder"andを試しました。彼らはすべて同じものを印刷します:cl example\ foldercl ~/"example folder"

-bash: cd: too many arguments
example folder

以下は、現在のディレクトリのみを一覧表示するlsコマンドです。

それでは、この問題を解決する方法はありますか?スペースを含むディレクトリを渡すには?

ベストアンサー1

function cl {cd $1; echo $1; ls -al $1}

Bash構文よりzsh構文に近いですが、それでもなお多くの問題があります。

存在するbash

  • その後にはスペースが必要{で、その前には}コマンド区切り記号(;、、&改行文字ですがそれも大丈夫です)が必要です。)zshでは動作しません。
  • パラメータ拡張は引用符で囲む必要があります。それ以外の場合は分割+globを経ます。 zshでは動作しません。
  • 変数データをオプションではなく汎用パラメータとして渡す場合は、オプションを閉じるタグ()を前に付けると、データが--オプションとして処理されるのを防ぐことができます-
  • cd次のコマンドを実行した後、終了ステータスを確認しません。
  • echo任意のデータの出力には使用できません。代わりに使用してくださいprintf
  • cd編集後に$1相対パスls -la $1(またはより正確にはls -la -- "$1")は機能しなくなります。$1おそらくあなたはls -la(またはls -lA)だけが欲しいでしょう。
  • スクリプトは一般的にcd一緒に使用し、他の言語のように動作するように設定されていないか空であることを-P確認してから()を使用しようとします。ただし、対話型シェルで関数を使用している場合は適用されません。$CDPATHCDPATH= cd -P -- "$1"chdir()
  • function f { ...; }関数定義のためのksh構文。標準構文よりもこれを好むbash理由はありません。f() { ...; }

だから:

cl() {
  cd -- "$1" || return
  printf '%s\n' "$1"
  ls -Al
}

引数が渡されない場合、cdディレクトリは次のように変更されます。ディレクトリ(cdまたはに似ています)。cd ~cd "$HOME"

ただし、ここでcl引数なしで呼び出すと、引数がまったくない(そして窒息する可能性がある)"$1"代わりに空の引数に拡張されます。引数なしでifをcd呼び出すには、(ホームディレクトリに移動してそこにあるファイルを一覧表示する)に置き換えるか、または受け取ったものと同じ引数のリストで呼び出すことができます。たとえば、orを使用できます。cdclcl"$1"${1+"$1"}cdcl"$@"cl -P ../bincl -- -dir-whose-name-starts-with-dash

その後、最初の引数または最初の引数のみをcd使用する代わりに、後で現在の作業ディレクトリを印刷できます。printf '%s\n' "$PWD"pwd

cl() {
  cd "$@" || return
  pwd
  ls -Al
}

追加資料:

おすすめ記事