私はここで何が間違っているのかわかりません。
User2 は、環境固有のエイリアスを設定するために、独自の .bash_profile からファイルをインポートします。
# .bash_profile
source $HOME/set_environment_shortcuts
$HOME/set_environment_shortcutsにあります(ここには多くのエイリアスがあります)。例:
alias startservices="verylongcommand"
今、「他のユーザーからサービスを開始」したいと思います。
[User1@server1 ~]$ sudo su -l User2 -c '. ~/.bash_profile; startservices'
-bash: startservices: command not found
runuser コマンドは同じ結果を生成します。
[User1@Server1 ~]$ sudo runuser -l User2 -c '. ~/.bash_profile; startservices'
-bash: startservices: command not found
エイリアスはこのように動作できませんか?
このコマンドは、エイリアスが完全に無視されると機能します。
ベストアンサー1
シェルが非対話型の場合、expand_aliases
シェルオプションの設定に使用されない限り、エイリアスは拡張されませんshopt -s expand_aliases
。
Aliasはインタラクティブな使用のための短縮ツールです。すべての種類のスクリプトには代わりにシェル関数を使用してください。
startservices () {
# commands go here
}
シェル関数は、多くの点でエイリアスよりもはるかに柔軟です。まず、シェルスクリプトなどのパラメータを受け入れます。
startservices () {
user="$1"
service="$2"
# code to start service "$service" as user "$user"
}
他のユーザーのソースを明示的にインポートする必要はありません.bash_profile
。代わりに使用してくださいsudo -i
。これにより、.bash_profile
起動時に次のログインシェルが起動します。
$ sudo -i -u User2 startservices
これはstartservices
、スクリプトまたはその他の外部ユーティリティ、シェル起動ファイル$PATH
で定義されているシェル関数、またはシェル起動ファイルで定義さUser2
れたエイリアスでなければなりませんUser2
(シェルを実行するにはsetを使用)。expand_aliases
User2
また、見ることができますsudo suを実行する理由はありますか?