Například pokud chci vytvořit soubor a zadat text na jeden řádek, mohu přesměrovat výstup do souboru pomocí >
operátor:
echo "something" > /path/foobar
ale pokud nemám přístup ke složce /path/
a potřebujete oprávnění sudo, Jak mohu dosáhnout stejného příkazu jako normální uživatel s právy sudo?
Zkusil jsem
sudo echo "something" > /path/foobar
ale to nefunguje, protože sudo se počítá pouze pro edit
ale ne pro pravou část
>
Jistě, mohl jsem se dříve stát rootem pomocí sudo su
nebo použijte tee
místo toho:
echo "something" | sudo tee /path/foobar
Ale rád bych našel řešení, kde bych mohl pracovat s posledním řádkem jako náhradou přes
sudo !!
Neexistuje způsob, jak „recyklovat“ poslední řádek a jednoduše přidat sudo
vpředu?
Přijatá odpověď:
Nemůžete jen tak nalepit sudo
před příkazem shellu musíte vyvolat shell, abyste tento příkaz znovu vyhodnotili (provedení věcí jako rozbalení proměnných, otevření souborů pro operátory přesměrování atd.). Takže to je
sudo bash -c !!
až na to, že to tak úplně nefunguje, protože !!
interpoluje text předchozího příkazu, speciální znaky a vše. Musíte načíst text příkazu jako řetězec a předat jej jako argument do sh
. Naštěstí bashův fc
vestavěný vám to umožní¹.
sudo bash -c "$(fc -ln -1)"
Nebo dokonce, abyste si byli jisti, že vyvoláte stejnou verzi bash, která aktuálně běží:
sudo "$BASH" -c "$(fc -ln -1)"
Všimněte si, že protože se příkaz provádí v samostatném procesu shellu, dědí proměnné prostředí (pouze ty, které sudo
zachovává, mysl), ale ne vnitřní proměnné shellu. Možnosti prostředí (např. kshglob
) a další nastavení začnou také od výchozího nastavení.
Stejný příkaz² funguje v zsh a ksh, ačkoli ATT ksh93 vyžaduje oba first
a last
číslo, které má být předáno fc
³ (který funguje také v bash, zsh a pdksh/mksh):
sudo zsh -c "$(fc -ln -1)"
sudo ksh -c "$(fc -ln -1 -1)"
sudo "$0" -c "$(fc -ln -1 -1)"
Pomocí $0
označení spustitelného souboru běžícího shellu funguje pouze v případě, že byl shell vyvolán přes $PATH a $PATH se nezměnilo, nebo přes absolutní cestu.
Zde je další metoda v zsh, která je o něco jasnější, ale delší:
sudo zsh -c $history[$[HISTCMD-1]]
Poslední slovo varování:sudo
je pro potenciálně nebezpečné příkazy. Neusnadňujte si jeho používání!
¹ Na začátku jsou nějaké mezery navíc a substituce příkazu odstraňuje nové řádky na konci, ale syntaxe shellu se o to nestará.
² Nemyslím si, že zsh nebo ksh mají něco jako bashův $BASH
; $0
funguje pouze tehdy, když je to absolutní cesta nebo když neobsahuje žádné lomítko a cesta pro vyhledávání příkazu se nezměnila.
³ fc
je alias pro hist
v ATT ksh, ale to je stejně dobré.