「sudo ls ~」が/rootの代わりに/home/usernameの内容を表示するのはなぜですか?

「sudo ls ~」が/rootの代わりに/home/usernameの内容を表示するのはなぜですか?

私がログインしたときusername、なぜ

sudo ls ~

代わりに何が表示されますか?コマンドがrootとして実行されているとします。この場合、ルートはを表します。/home/username/rootsudo~/root

さらなる説明:

また、そのコマンドを実行しsuてから実行すると、ls ~表示される内容が得られます/root。だから私はこれをするのがsudo ls ~

別の例として、フラグ付きの一部のコマンドは--user実行時にユーザーをrootとして解釈しますsudo。たとえば、はのディレクトリにインストールし、はのディレクトリにインストールします。最後のコマンドを実行することはお勧めできません。私は私が説明した機能を表示するためにこのコマンドを使用しました。pip install --user packagename/home/usernamesudo pip install --user packagename/root

答え1

~実行する前にシェルが展開されますsudo。以下を使用してこれを確認できますset -x

$ set -x
$ sudo ls ~
+ sudo ls /home/skitt

これは、実際に実行されたコマンドが拡張時に現在のユーザーを使用してホームディレクトリを拡張したことを示します。

ターゲットユーザーのホームディレクトリを表示するには、次のことを延期する必要があります。チルダ拡張:

sudo bash -c 'ls ~'

関連情報