web-dev-qa-db-ja.com

zshとbashの間でエイリアスとPATH設定を共有する

私が通常使用するシェルはzshです。 lsgrepなどの一部のプログラムで色を有効にするエイリアスがいくつかあります。また、標準以外の場所(~/bin/など)でプログラムを実行できるように、カスタムパスを設定しました。

私は rootのシェルを変更しないzshに変更しますが、これらの設定を共有して、rootも同じように設定できるようにしたいと思います。 zsh/etc/profileを調達していないことがわかりました。 /etc/zsh/zprofileで調達できますが、他の「適切な」方法が欲しいのですが。

24
phunehehe

ファイル/etc/commonprofileを作成し、/etc/profile/etc/zsh/zprofileの両方でソースを取得します。これにより、一般的な設定を共有し、bashをそれぞれ使用する機会が得られます。zsh特定の設定と/etc/profileの構文zprofile

17
fschmitt

Zshには、POSIX shコードといくつかのbash拡張を実行できるsh互換モードがあります。 zshにない(同じ構文で)bash機能を使用しない限り、両方のシェルから同じファイルを入手できます。組み込みのemulateを使用して、zshを互換モードにします。 -Lオプションを使用すると、エミュレーションは囲んでいる関数に対してローカルになります(囲んでいるソーススクリプトではありません)。

source_sh () {
  emulate -LR sh
  . "$@"
}

環境変数などの場合、source_sh /etc/profileでは/etc/zprofileを、source_sh ~/.profileでは~/.zprofileを使用できます。これは、プロファイルファイルがbash固有の機能を使用する可能性が低いためです。

エイリアスや関数定義などの場合、シェルのrcファイルには共有できない多くのものが含まれている可能性が高いため(プロンプト、キーバインディング、補完設定など)、~/.sh_aliasesのようなファイルを使用します。 ~/.bashrcで提供され、source_sh~/.zshrcで提供されています。

単純なシンボリックリンクはどうですか?

ln -s /etc/profile /etc/zsh/zprofile

条件付き初期化が必要な場合は、次のように追加することもできます。

#Determine our Shell without using $Shell, which may lie
Shell="sh"
if test -f /proc/mounts; then
   case $(/bin/ls -l /proc/$$/exe) in
        *bash) Shell=bash ;;
        *dash) Shell=dash ;;
        *ash)  Shell=ash ;;
        *ksh)  Shell=ksh ;;
        *zsh)  Shell=zsh ;;
    esac
fi
4
echox

変数に関しては、モジュールとモジュールファイル[1]が不足しているようです。これを始めると、単一のモジュールファイルの便利さから、さまざまなシェル(bashとzshを含む)、python、Perl、さらに多くの環境に共通のプロファイルを簡単に作成できます。

同じ方法でエイリアスを定義することもできます。ただし、連続するシェル間でエイリアスがうまく継承されず、回避策が必要になる場合があります。

[1] http://en.wikipedia.org/wiki/Environment_Modules_(software)

0
fgeorgatos