シェルスクリプトの実行権限を自動的に設定する

シェルスクリプトの実行権限を自動的に設定する

私はシェル スクリプトをよく使用します。 実際には、スクリプトを作成して実行しようとすると、 を設定し忘れたために権限エラーが発生します+x。 これは非常に面倒なことのように思えますが、エラーを表示するのではなく、シェル ( zsh) に実行権限を追加して再試行するかどうかを自動的に尋ねさせる方法はありますか?

単に で済むのはわかっていますsource my.shが、ソーシングは で実行することと同じではないので./my.sh、後者を希望します。

答え1

スクリプトを作成する代わりに、機能(既存のスクリプトを関数に変換します)。そうすれば、権限について心配する必要がなくなります。

スクリプトは簡単に関数に変換できます。

  1. .shファイル名から拡張子を削除します。(技術的にはオプションですが、それが慣例だ
  2. ファイルの親ディレクトリが にあることを確認してください$fpath
  3. autoloadあなたの機能.zshrc

プロジェクトごとに異なる機能が必要な場合は、https://github.com/direnv/direnvそうすれば、各プロジェクトは独自の ed 関数を持つことができ$fpathますautoload

答え2

これが役に立つかもしれません:

function command_permission() {
  # Get the command being run
  local cmd="${1}"
  local cmd=$(echo "${cmd}" | awk '{print $1}' )

  # Check if it starts with "./" and if the file doesn't have execute permission
  if [[ "${cmd}" =~ ^\./ && ! -x "${cmd#./}" ]]; then
    # Prompt for permission to chmod +x the file
    read -rq "REPLY?${cmd#./} is not executable. Do you want to make it executable (y/n)? "
    "$cmd" "$@"

    if [[ "${REPLY}" =~ ^[Yy]$ ]]; then
      # Make the file executable
      chmod +x "${cmd#./}"
    fi

    # Add a newline after the prompt
    echo ""
  fi
}

# Set the preexec function to be called before running each command
autoload -Uz add-zsh-hook
add-zsh-hook preexec command_permission

関連情報