他のユーザーがaliasコマンドを実行できなかった場合

他のユーザーがaliasコマンドを実行できなかった場合

私はここで何が間違っているのかわかりません。

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_aliasesUser2

また、見ることができますsudo suを実行する理由はありますか?

おすすめ記事