エイリアス文字列コマンドを実行しています

エイリアス文字列コマンドを実行しています

開発プロジェクト ディレクトリを調べて、それぞれにエイリアス ショートカットを追加する簡単なスクリプトを作成しました。

shopt -s dotglob #Use shopt -u dotglob to exclude hidden directories
find ~/development/* -prune -type d | while IFS= read -r d; do 
    cur_dir="${d##*/}"
    cmd="alias ${cur_dir}=\"code $d\""
    echo "executing: $cmd"
    $cmd
done

出力は次のようになります。

executing: alias project-1="code /home/my_user/development/project-1"
./alias_for_projects.sh: line 6: alias: /home/my_user/development/project-1": not found
...

コマンドをコピーして実行すると:

alias project-1="code /home/my_user/development/project-1"

問題なく動作します... スクリプトを修正するにはどうすればいいですか?

答え1

2つの問題があります:

  1. 走るのは難しい変数に格納されたコマンド。しかし、実際にはコマンドを変数に格納する必要はありません。alias "${cur_dir}"="code $d"を実行する場所で実行するだけで済みます$cmd

  2. サブシェルで実行していますalias。Bash は、パイプされたコマンドをサブシェルで実行します (lastpipeが設定されていない場合)。ただし、パイプ (またはfindどちらも) は必要ありません。通常のグロブを使用できます (これは既に使用しているため、 はfindさらに意味がありません)。

組み合わせ:

shopt -s dotglob
for d in ~/development/*/; do         # trailing slash - only directories match
    cur_dir="${d%/}"                  # strip trailing slash
    cur_dir="${cur_dir##*/}"
    alias "${cur_dir}"="code $d"
done

答え2

すべてのコメントを読んだ後、スクリプトを次のように修正しました。

shopt -s dotglob #Use shopt -u dotglob to exclude hidden directories
while IFS= read -r d; do 
    cur_dir="${d##*/}"
    #echo "${cur_dir}"="code $d"
    alias "${cur_dir}"="code $d"
done <<<$(find ~/development/* -prune -type d)

関連情報