たとえば、ファイルを作成して1行にテキストを入力する場合は、>
を使用して出力をファイルにリダイレクトできます。 演算子:
echo "something" > /path/foobar
ただし、フォルダ/path/
にアクセスできない場合 sudo特権が必要です。sudo権限を持つ通常のユーザーと同じコマンドを実行するにはどうすればよいですか?
試しました
sudo echo "something" > /path/foobar
ただし、sudoはedit
に対してのみカウントされるため、これは機能しません。 ただし、>
の正しい部分
ではありません
確かに、以前はsudo su
でrootになることができました またはtee
を使用します 代わりに:
echo "something" | sudo tee /path/foobar
しかし、私は最後の行を代わりに使用できる解決策を見つけたいと思います
sudo !!
最後の行を「リサイクル」してsudo
を追加する方法はありませんか 前に?
承認された回答:
sudo
だけに固執することはできません シェルコマンドの前で、シェルを呼び出してそのコマンドを再度評価する必要があります(変数の展開、リダイレクト演算子用のファイルのオープンなど)。
sudo bash -c !!
!!
であるため、これは完全には機能しません。 前のコマンドのテキスト、特殊文字、およびすべてを補間します。コマンドのテキストを文字列として取得し、それを引数としてsh
に渡す必要があります 。幸い、bashのfc
ビルトインでそれができます¹。
sudo bash -c "$(fc -ln -1)"
または、現在実行されているのと同じバージョンのbashを必ず呼び出すようにします。
sudo "$BASH" -c "$(fc -ln -1)"
コマンドは別のシェルプロセスで実行されるため、環境変数(sudo
の変数のみ)を継承することに注意してください。 保存しますが、シェルの内部変数は保持しません。シェルオプション(例:kshglob
)およびその他の設定もデフォルトから開始されます。
同じコマンド²がzshとkshで機能しますが、ATTksh93ではfirst
およびlast
fc
に渡される番号 ³(bash、zsh、pdksh / mkshでも機能します):
sudo zsh -c "$(fc -ln -1)"
sudo ksh -c "$(fc -ln -1 -1)"
sudo "$0" -c "$(fc -ln -1 -1)"
$0
を使用する 実行中のシェルの実行可能ファイルを指定することは、シェルが$ PATHを介して呼び出され、$ PATHが変更されていない場合、または絶対パスを介してのみ機能します。
これがzshの別の方法で、少し明確ですが長いです:
sudo zsh -c $history[$[HISTCMD-1]]
警告の最後の言葉:sudo
潜在的に危険なコマンド用です。使いやすくしすぎないでください!
¹最初に余分な空白があり、コマンド置換によって最後の改行が削除されますが、シェルの構文はそれを考慮していません。
²zshやkshにはbashの$BASH
のようなものはないと思います; $0
絶対パスである場合、またはスラッシュが含まれておらず、コマンド検索パスが変更されていない場合にのみ機能します。
³fc
hist
のエイリアスです ATT kshでですが、それは同じくらい良いです。