学校のコンピュータを使用しており、zsh
ではなくbash
を使用したいと考えています。デフォルトのシェルにしたいのですが、管理者権限がないため、$ chsh -s $(which zsh)
などのコマンドを実行できません。
.bashrc
に何かを入れたり、回避策として開いたときに自動的にzsh
を呼び出す方法はありますか?
明確にするために、zsh
はすでにインストールされています。
ホームディレクトリに.bash_profile
を作成し、次の行を追加します。
export Shell=/bin/zsh
exec /bin/zsh -l
更新:.profile
は、デフォルトのシェルがbashでない場合の一般的な解決策として機能する可能性があります。 .profile
がZshによって呼び出されて冗長になる可能性があるかどうかはわかりませんが、簡単なチェックで安全に実行できます。
export Shell=/bin/zsh
[ -z "$ZSH_VERSION" ] && exec /bin/zsh -l
また、which
を使用して、$PATH
の値に依存するzsh
の動的パスを取得することもできます。
export Shell=`which zsh`
[ -z "$ZSH_VERSION" ] && exec "$Shell" -l
通常、chsh
は非rootユーザーとして使用できます。ただし、通常はNISやLDAPなどの何らかのネットワークユーザーデータベースを使用するサイトでは、この機能が無効になることがあります。代わりにypchsh
(NIS)またはchsh.ldap
(LDAP)が存在する可能性があります。
chsh
は通常、一部の承認済みシェルも許可します。通常、/etc/shells
にリストされているシェルです。
サイトでchsh
またはそのバリアントを使用できない場合は、ログインシェルをexec
にお気に入りのシェルに配置し、Shell
変数が好きなシェル。
ログインシェルがsh
、dash
またはksh
の場合:編集する必要があるファイルは~/.profile
です。このファイルはインタラクティブセッションの最初と一部の非インタラクティブセッションスタートアップスクリプト(X11セッションの場合など)によって読み取られるため、注意が必要です。exec
のみを呼び出します(現在のプロセス)現在のシェルがインタラクティブな場合。 Bourneシェル(Solaris 10以前の/bin/sh
)を除いて、オプションリスト($-
)にi
が存在することにより、シェルがインタラクティブであることを確認できます。
preferred_Shell=
if [ -x /bin/zsh ]; then
preferred_Shell=/bin/zsh
fi
…
if [ -n "$preferred_Shell" ]; then
case $- in
*i*) Shell=$preferred_Shell; export Shell; exec "$preferred_Shell";;
esac
fi
Zshに.zprofile
を読み取らせる場合は、-l
オプションを渡します。
ログインシェルがbash
の場合は、上記の手順を実行できます。または、これらのコマンドを~/.bash_profile
に入れることもできます。ほとんどのセッション起動スクリプトは~/.profile
のみを読み取り、~/.bash_profile
は読み取らないが、bashの下で実行されて.bash_profile
を読み取るスクリプトがあるので、exec
です。
ログインシェルがcshまたはtcshの場合は、 の例を参照してください。chshまたは管理者権限なしでデフォルトシェルを変更する
管理者権限がないためにchsh
を実行できない場合は、実行する人と話してください。
使用しているシステムがchsh
が機能しないように構成されているため、たとえば、システムがNISまたはLDAPではなくNISまたはLDAPを使用しているため、chsh
を非ルートとして使用できない可能性があります。 _/etc/passwd
_ファイルだけです。あるいは、システムの管理者が何らかの制御を維持したいだけかもしれません。
シェルを変更する手順は、組織のポリシーによって異なります。 chsh
が通常行うことを実行するローカルコマンドがある場合があります。または、シェルの変更をリクエストするサポートチケットを送信する必要がある場合があります。
他のほとんどの回答は適切ですが、管理者が合理的に対応している場合は、起動スクリプトをハッキングする必要はありません。ログイン後、管理者が自分のアカウントを更新するまで_zsh -l
_を手動で呼び出すだけです。
留意すべきもう1つのこと:異なるシェルが同じ起動ファイルを使用することがあります。たとえば、sh
とbash
はどちらも_$HOME/.profile
_を実行でき、csh
とtcsh
はどちらも_$HOME/.login
_と_$HOME/.cshrc
_(ただし、_.bashrc
_、_.bash_profile
_、_.tcshrc
_などのシェル固有の起動ファイルはこれらをオーバーライドできます)。デフォルトのシェルが_/bin/csh
_であり、_/bin/tcsh
_を使用する場合、_.login
_を更新して_/bin/tcsh -l
_を呼び出すと、無限ループが発生する可能性があります。 zsh
がbash
固有の起動ファイルを実行することはないので、それは問題ではありません。
ほとんどのシェルは、実行しているシェルを識別する変数を設定します(_$BASH_VERSION
_、_$tcsh
_、_$ZSH_VERSION
_)。起動シェルを記述して優先シェルを呼び出す場合は、それをif
で囲むことは悪い考えではないため、そのシェルをまだ実行していない場合にのみ実行されます。 konsoleboxの答え からのコードを使用して:
_if [ "${ZSH_VERSION:-unset}" = "unset" ] ; then
export Shell=/bin/zsh
exec /bin/zsh -l
fi
_
(_"${ZSH_VERSION:-unset}"
_だけではなく_"$ZSH_VERSION"
_をチェックすることで追加される複雑さにより、_set -o unset
_を実行した可能性があります。これは、未定義の変数への参照をエラーにするオプションです。)
コマンドchsh
はまさにこの目的のためだと思います。ただし、すべてのLinux/Unixディストリビューションがそれをサポートしているとは限りません。 chsh
のmanページを確認してください。
いくつかのシナリオを考えることができます。
zsh
は/etc/shells
にはなく、OPはコマンドプロンプトでzsh
と入力せずにそれを使用したいと考えています。可能な解決策。
a)ログイン時にプロファイルトリックを使用して実行します。これは、実際にシェルを変更するのと同じくらい効果的です。
b)管理者にzsh
を/etc/shells
に追加して、chsh
を追加できるようにしてください
c)管理者にシェルを変更するよう依頼してください。 ftp
を使用できなくなるため、これは賢明ではありません。/etc/shells
にシェルがある場合にのみ、ftp
を使用できます。
ユーザーは制限付きのシェル(ほとんどの場合rbash
またはrsh
)をエスケープしたい。
.profile
が編集可能な場合、PATH
は編集して展開できます。 /bin
がパスに含まれると、rsh/rbash
内からbash
を起動し、chsh
コマンドにアクセスしてシェルを変更できます。多くのコマンドには、制限付きのシェルをエスケープしてchsh
へのアクセスを回復するために使用できるシェルエスケープがあります。
chsh
は、他の何らかの理由で実際には機能しません。可能性1からのソリューションaもここでの答えです。
シナリオ2は、デフォルトのシェルを実際に変更する唯一の理由です(制限が厳しすぎます)。