カスタムzshスクリプトを自動的に実行可能にする方法は?

カスタムzshスクリプトを自動的に実行可能にする方法は?

これを行う方法については非常に簡単な内容がありませんが、単純なスクリプトがあります。

extract () {
  if [ -f $1 ] ; then
    case $1 in
      *.tar.bz2)   tar xvjf $1    ;;
      *.tar.gz)    tar xvzf $1    ;;
      *.tar.xz)    tar xvJf $1    ;;
      *.bz2)       bunzip2 $1     ;;
      *.rar)       unrar x $1     ;;
      *.gz)        gunzip $1      ;;
      *.tar)       tar xvf $1     ;;
      *.tbz2)      tar xvjf $1    ;;
      *.tgz)       tar xvzf $1    ;;
      *.zip)       unzip $1       ;;
      *.Z)         uncompress $1  ;;
      *.7z)        7z x $1        ;;
      *.xz)        unxz $1        ;;
      *.exe)       cabextract $1  ;;
      *)           echo "\'$1': unrecognized file compression" ;;
    esac
  else
    echo "\'$1' is not a valid file"
  fi
}

スクリプトは機能しますが、ログイン時にデフォルトで実行できないようです。

私はこの非常に徹底的な答えを見つけました。zshで独自のシェル関数を定義してロードする方法そして、関数を保存するディレクトリを表示するために$ fpathをインポートしました。

私の.zshrc設定ファイルの一番下に追加したのはfpath=( ~/.local/bin "${fpath[@]}" )私の機能を持つパスです。

これを入力すると、次のような結果echo $fpathが表示されます。

/home/me/.local/bin /home/me/.oh-my-zsh/plugins/git /home/me/.oh-my-zsh/functions /home/me/.oh-my-zsh/completions ...

autoload -Uz extractただし、ログインするたびに明示的に入力しないと機能しません。

ログイン時にディレクトリ全体を自動的にロードする方法はありますか?

ベストアンサー1

スクリプトと関数を混同しています。

スクリプトの作成

スクリプトは独立したプログラムです。 zshで書くこともできますが、zshコマンドラインだけでなくどこでも呼び出すことができます。 zshコマンドラインまたは他のzshスクリプトでzshで書かれたスクリプトを実行している場合、これは偶然であり、スクリプトの動作には影響しません。スクリプトは独自のプロセスで実行され、親プロセスには影響しません(たとえば、変数や現在のディレクトリを変更することはできません)。

コードは、どこからでも呼び出すことができ、実行中のシェルの状態にアクセスする必要がない独立したタスクを実行するため、関数ではなくスクリプトである必要があります。

スクリプトは実行可能ファイルでなければなりません。chmod +x /path/to/script.itは次に終わるはずです。シェルボーンラインカーネルにスクリプトを解釈するために使用するプログラムを教えてください。あなたの場合は、ファイルの上部に次の行を追加します。

#!/usr/bin/env zsh

変数にリストされているディレクトリにファイルを配置します$PATH。多くのシステムがユーザーのデフォルトに設定されているため、~/bin使用できます。追加のディレクトリを追加するには、次を参照してください。~/.local/binPATHhttp://unix.stackexchange.com/questions/26047/how-to-Correctly-add-a-path-to-path

別名、関数、または組み込みコマンドではなくコマンド名を入力すると、シェルはその名前の実行可能ファイルを見つけて$PATH実行します。したがって、スクリプトをシェルに宣言する必要なく正しい場所に配置するだけです。

関数を作成してください

関数は、既存のシェルインスタンス内で実行されるコードです。変数、現在のディレクトリ、関数、コマンド履歴など、すべてのシェル状態へのフルアクセス権を持ちます。互換性のあるシェルからのみ関数を呼び出すことができます。

コードは関数として機能しますが、関数で作成しても何も得られず、他の場所(ファイルマネージャなど)でコードを呼び出す機能が失われます。

zshでは、関数の定義を~/.zshrc.zshrc自動ローディングは2段階で行われます。

  1. 関数名を宣言するために使用されますautoload -U myfunction
  2. myfunction初めて呼び出されると、zshはmyfunctionリストされたディレクトリで名前付きファイルを見つけて、見つかった$fpath最初のファイルをmyfunction

すべての機能は使用前に定義する必要があります。そのため、ファイルを$fpathautoload$fpath

% autoload -U myfunction
% which myfunction
myfunction () {
        # undefined
        builtin autoload -XU
}

Zshには、ナビゲーションを通じてこれらのスタブを生成するメカニズムがあります$fpath。これは完了サブシステムに含まれています。

  • 置く#autoloadファイルの最初の行に。
  • 完成システム初期化関数を呼び出す前に、完全に設定されて.zshrcいることを確認してください。fpathcompinit

関数定義を含むファイルには関数を含める必要があります。、関数の定義ではありません。これは、zshが関数を呼び出すときにファイルの内容を実行するためです。したがって、コードを関数に入れるには、以下を含むディレクトリの1つextractにあるというファイルにコードを入れます。$fpath

#autoload
if [ -f $1 ]; then

関数がロードされたときに初期化コードを実行したり、ヘルパー関数を定義したい場合は、このイディオム(zshディストリビューションで使用)を使用できます。補助定義およびその他の初期化コードとともに、関数定義をファイルに保存します。最後に、関数を呼び出してパラメータを渡します。これには以下がmyfunction含まれます。

#autoload
my_auxiliary_function () {
}
myfunction () {
}
myfunction "$@"

ポリスチレン

7z xほとんどのアーカイブタイプで動作します。

おすすめ記事