aliasy nie są pobierane, gdy sudo w systemie Mac? [Zamknięte]

0

Mam następujące aliasy w /etc/profile.

# System-wide .profile for sh(1)

if [ -x /usr/libexec/path_helper ]; then
        eval `/usr/libexec/path_helper -s`
fi

if [ "${BASH-no}" != "no" ]; then
        [ -r /etc/bashrc ] && . /etc/bashrc
fi

alias startapache="/usr/local/Cellar/httpd22/2.2.29/bin/apachectl start"
alias stopapache="/usr/local/Cellar/httpd22/2.2.29/bin/apachectl stop"

alias ll='ls -lG'

Właśnie dodałem ostatnie trzy aliasy. Teraz kiedy to zrobię

sudo su: Nie rozumiem tych aliasów.

sh-3.2# startapache
sh: startapache: command not found

ale kiedy nie wykonuję sudo , otrzymuję te aliasy (To jest powłoka bash). Ale to nie zaczyna apache.

local:~ 112019$ startapache 
(13)Permission denied: make_sock: could not bind to address [::]:80
(13)Permission denied: make_sock: could not bind to address 0.0.0.0:80
no listening sockets available, shutting down
Unable to open logs
burza mózgów
źródło
1
Wydaje się, że tytuł tego pytania mówi o systemie OS X i sugerują to niektóre szczegóły. (Na przykład użytkownicy komputerów Mac często umieszczają aliasy w plikach „profilowych”, ponieważ często nie widzą łatwo, jak jest to niewiarygodne, co z kolei wynika z faktu, że Terminal.app uruchamia powłokę logowania, co jest niezwykłe dla terminala graficznego z wyjątkiem systemu operacyjnego X. sudo suUruchomienie daje powłokę z bardzo prostym monitem, co zwykle nie dzieje się, gdy jest uruchomiona w Ubuntu.) Jeśli to pytanie dotyczy systemu OS X, a nie Ubuntu, powinniśmy go zamknąć, być może migruj do Unix.SE.
Eliah Kagan

Odpowiedzi:

1

bashShell tylko czyta /etc/profile, gdy wywoływany jako powłoki logowania , które sunormalnie nie robić - trzeba by powołać susię -, -lczy --loginopcja. Od man su:

   -, -l, --login
       Provide an environment similar to what the user would expect had
       the user logged in directly.

       When - is used, it must be specified as the last su option. The
       other forms (-l and --login) do not have this restriction.

Zobacz, man bashaby uzyskać szczegółowe informacje o tym, które pliki startowe są odczytywane przez interaktywne logowanie, interaktywne logowanie bez logowania i nieinteraktywne powłoki.

steeldriver
źródło
ok, podążyłem za sudo su -lnim i wydaje się, że wybiera alias.
burza mózgów
0

Aby udostępnić te aliasy root, możesz je umieścić /root/.bash_aliases.

Jeśli jednak chcesz uruchomić te aliasy rootod użytkownika, możesz je po prostu wstawić ~/.bash_aliasesi dodać sudona początku polecenia każdego aliasu:

alias startapache="sudo /usr/local/Cellar/httpd22/2.2.29/bin/apachectl start"
alias stopapache="sudo /usr/local/Cellar/httpd22/2.2.29/bin/apachectl stop"
alias ll='sudo ls -lG'

Na początku też tego nie zauważyłem, ale użycie lljako aliasu ls -lGprzytłoczyłoby zachowanie niesłyszącego llaliasu, jeśli zostało ustawione /root/.bash_profilei ustawione ~/.bash_profile, jeśli jest ustawione jako alias ls -la: więc chyba, że ​​chcesz llprzytłumić zachowanie aliasu dla użytkownika, który ostatecznie dodasz te aliasy, powinieneś zmienić jego nazwę na coś innego, np. na lg:

alias lg='sudo ls -lG'
kos
źródło
2
Tworzenie wspólnego lsaliasu, takiego jak lluruchamianie lsz, sudowydaje się złym pomysłem, ponieważ lsnie trzeba / nie należy uruchamiać jako root, gdy nie jest to konieczne, a ponieważ uruchamianie go jako root, gdy nie jest to oczekiwane, byłoby dziwne . (W szczególności użytkownik może być zdezorientowany, dlaczego wyświetla monit o podanie hasła, lub może być zdezorientowany, dlaczego nie może uzyskać dostępu cddo katalogu, który wydaje się być w stanie ls.) Jeśli sudo ls -lGpotrzebny jest alias do uruchomienia , sugerowałbym jedna z innej nazwy - może ją nazwać sll.
Eliah Kagan
@EliahKagan Dzięki, nie zauważyłem tego
kosztują