全然Debian特有ではないです。
From: Kenji Matsui kmatsui@earth.kiramori.net Subject: [debian-users 00105] Re: stretchで日本語入力できない Date: Sun, 23 Jul 2017 08:23:29 +0000
なぜ sudo では内部コマンドが実行できないのかなと疑問に感じたのですが ルート権限でしか実行できないコマンドのみ sudo で実行しなさい、 というようなことでしょうか。
ちょっと違います。 「ルート権限で実行したいコマンドだけを sudo で実行しなさい」 でしょう。rootだって普通のことがしたいときもあるのです。
なぜ sudo では内部コマンドが実行できないのかなと疑問に感じたのですが
内部コマンドは、実行しているシェルに対する命令です。 ですので、sudoで実行するのは意味不明です。
ということで、sudoでbashを起動して、それで実行すればOK。 (以下、cdするディレクトリに意味はありません) $ cd /tmp $ sudo bash -c 'cd /; pwd' /
もちろん、子プロセスでのシェル操作は親プロセスには影響しませんので…。
$ cd /tmp $ sudo bash -c 'cd /; pwd' / $ pwd /tmp
といった感じ。加えて、子プロセスは実行終了すると消えてしまいます。 次のsudoに引き継がれません。
$ cd /tmp $ sudo bash -c 'pwd' /tmp $ sudo bash -c 'cd /; pwd' / $ sudo bash -c 'pwd' /tmp
どうすればいいか。1回のsudoで一気に実行すればいいわけです。 つまり、一連の手順をシェルスクリプトにして、それをsudoで実行する、と。 そうすれば、シェルスクリプト内に書いたcdもsourceも、環境変数の変更も、 ちゃんと動きます。
余談。pwdですが、bashは内部コマンドで持っていますが、/bin/pwdも あります。