次のシェルスクリプトがあります
#!/bin/bash
# Search elixir code with ack
# By default skip the dependencies and test directories
ignore_dirs=("dependencies" "test" "config")
# the for call below inserts newlines so we need to strip them out which is why the tr -d part is on the end
# of the assignment
ign_dirs="$(for i in "${ignore_dirs[@]}"; do echo "--ignore-dir=$i "; done | tr -d '\n')"
# By default skip the mix.exs file
ignore_files=("is:mix.exs" "is:credo.exs")
ign_files="$(for i in "${ignore_files[@]}"; do echo "--ignore-file=$i "; done | tr -d '\n')"
pager=less
file_types=elixir:ext:ex,exs,eex,heex
#echo ack $1 --word-regexp --pager="$pager" --type-set="$file_types" "$ign_dirs" "$ign_files" --noenv
# Array variation
ack $1 --word-regexp --pager="$pager" --type-set="$file_types" "$ign_dirs" "$ign_files" --noenv
# Hardcoded variation
ack $1 --word-regexp --pager=less --type-set=elixir:ext:ex,exs,eex,heex --ignore-dir=dependencies --ignore-dir=test --ignore-dir=config --ignore-file=is:mix.exs --ignore-file=is:credo.exs --noenv
注釈付きエコーラインを使用してハードコードされたバリエーションを作成しました。ハードコーディングされたバリアントを実行すると、ackは期待どおりに機能します。配列バリアントを実行すると、ackはコマンドラインオプションを見ることができないようです。たとえば、含まれてはいけないmix.exsを含め、テストディレクトリを検索します。
私のシェルスクリプトが間違っていますか?ほとんどのシェルスクリプトをコピー/貼り付けました。echo $ign_dirs
正しい値が見えて見えるという意味です。コマンド(配列バリアント)を実行しても機能しません。これは私のシェルスクリプトに問題がないことを示しているようです。
ところで、私はこれをMacのzshで実行しています。私はこれをbashでテストし、同じ問題を見ました。
これがどこかにある一種の確認FAQなら事前にお詫び申し上げます。確認しましたが、問題を解決する項目が見つかりませんでした。
編集する:
私はそれを明確に言わなかったことがわかります。
結局私はElixirコードを自動的に検索するためにackを使用しようとしました。 bashスクリプト内でオプション/検索をできるだけ維持したいと思います。これにより、他のコンピュータの.ackrcファイルと環境変数の変更について心配する必要はありません。
私が期待するのは、ackがファイルを検索したときにignore_dirsにリストしたディレクトリを除いて、Ignore_filesに指定したファイルをスキップすることです。ハードコーディングされたバリアントを使用してシェルスクリプトを実行すると、ディレクトリは無視されます。配列バリアントを使用してシェルスクリプトを実行すると、無視されません。
はい、ign_dirsとign_filesは配列ではなく文字列であることを知っています。シェルスクリプトのコマンドラインから直接配列を使用できますか?
答え1
オプションの配列を作成します--ignore-*
。
ignore_dirs=("dependencies" "test" "config")
ign_dirs=()
for i in "${ignore_dirs[@]}"; do
ign_dirs+=("--ignore-dir=$i");
done
ignore_files=("is:mix.exs" "is:credo.exs")
ign_files=()
for i in "${ignore_files[@]}"; do
ign_files+=("--ignore-file=$i");
done
次に、コマンドで次の配列を使用します。
ack "$1" --word-regexp --pager="$pager" --type-set="$file_types" "${ign_dirs[@]}" "${ign_files[@]}" --noenv
答え2
最後のコマンドから変数の周りの引用符を削除します。
ack $1 --word-regexp --pager="$pager" --type-set="$file_types" $ign_dirs $ign_files --noenv
これらの変数にはスペースで区切られたいくつかの部分があり、スペースで区切られたいです。
元のコード(引用符を含む)は次のように展開されます。
ack $1 --word-regexp --pager=less --type-set=elixir:ext:ex,exs,eex,heex "--ignore-dir=dependencies --ignore-dir=test --ignore-dir=config" "--ignore-file=is:mix.exs --ignore-file=is:credo.exs" --noenv
したがって、値を含むキーセットの代わりに2つの位置パラメータが使用されます。