Saya menjalankan Ubuntu 10,04 dan saya gunakan upstart
untuk manajemen daemon. Aplikasi perusahaan saya dijalankan sebagai daemon dan harus dijalankan sebagai root karena berbagai hak istimewa. Misalnya:
sudo start my-application-long-ID
sudo stop my-application-long-ID
etc
Saya ingin memperkenalkan sebuah alias
untuk menyingkat perintah ini sebagai sesuatu seperti:
alias startapp='sudo start my-application-long-ID'
dan jalankan sebagai startapp
dan yang berfungsi tetapi saya lebih suka tidak memiliki sudo di alias.
alias startapp='start my-application-long-ID'
tidak ketika dijalankan menggunakan sudo startapp
, kembali sudo: startapp: command not found
.
Namun, ketika saya menambahkan alias:
alias sudo='sudo '
sudo startapp
sekarang berfungsi tetapi saya masih penasaran mengapa sudo mengabaikan alias.
source ~/.bashrc
? Ini memperbarui file .bashrc dan membuat alias baru tersedia?Jawaban:
Saya melihat informasi di bawah ini dari sini .
Saat menggunakan sudo, gunakan ekspansi alias (jika tidak sudo mengabaikan alias Anda)
Alasan mengapa itu tidak berhasil dijelaskan di sini .
sumber
Alias dan fungsi didefinisikan dalam sebuah shell. Sudo adalah program eksternal. Jadi sudo tidak melihat alias, fungsi atau shell builtin, hanya perintah eksternal.
Alias dimaksudkan untuk menjadi nama perintah alternatif, jadi shell hanya memperluasnya di posisi perintah, bukan ketika mereka argumen untuk perintah. Zsh mendukung alias global, yang diperluas di mana saja di baris perintah, dan sebaiknya digunakan hemat karena ada risiko tidak sengaja mengembangkannya bahkan dalam konteks di mana alias tidak masuk akal.
Anda dapat memberitahu sudo untuk memohon shell:
sudo sh -c '…shell command here…'
. Namun, alias biasa Anda tidak akan tersedia di dalam perintah shell itu, karena biasanya disimpan dalam file seperti~/.bashrc
atau~/.zshrc
yang hanya dibaca oleh shell interaktif.alias sudo='sudo '
, seperti yang diusulkan oleh Ramesh , menyebabkan shell untuk memperluas alias setelahnyasudo
.sumber
alias sudo='sudo '
bekerja untuk ZSH juga?Solusi untuk pengguna zsh
Di bash dan zsh, mengakhiri alias dengan spasi akan menyebabkan shell alias-perluas kata berikutnya. Ini memungkinkan sesuatu seperti yang berikut ini diperluas alias
myalias
Sayangnya ini berantakan ketika Anda memiliki lebih dari satu kata di alias Anda (seperti
sudo -u someone
. Namun Anda dapat menyalahgunakan fitur "global aliases" zsh untuk memperluas alias secara manual di mana saja dalam perintah.Ini menciptakan alias global yang disebut
$
(Anda dapat menggunakan kata apa pun yang Anda inginkan) yang berakhir dengan spasi. Ini menyebabkan zsh untuk memperluas kata berikutnya sebagai alias perintah biasa. Karena alias diperluas ke spasi putih, itu tidak akan diperlakukan sebagai argumen. Ini memungkinkan yang berikut berfungsi.Anda bahkan dapat menggunakan
$
beberapa kali pada satu baris perintah jika Anda memiliki penyatuan perintah yang rumit. Saya telah menemukan ini cukup berguna sehingga memiliki tempat permanen di zshrc saya, namun alias ini cukup sederhana untuk didefinisikan ketika Anda perlu menggunakannya.sumber
Saya hanya memberikan jawaban alternatif di sini tanpa mendefinisikan ulang
sudo
dengan alias.Dalam kasus Anda itu adalah:
Semua dalam satu baris, tidak ada shell tambahan, tidak ada alias redefinisi. ;-)
sumber
xargs
untuk menghilangkan tanda kutip, dan grep untuk menelanjangi yang terkemuka=
. Agak pintar, tapi mungkin tidak perlu.eval "sudo $(alias aliasname | cut -d= -f2-)"
kemungkinan lebih baik -xargs
tidak akan selalu menangani tanda kutip dengan benar, dan mungkin ada lebih dari satu=
di sana.xargs
jangan mencabut tanda kutip. Grep yang mengambil perintah yang diselesaikan dari antara tanda kutip. Anda tahutype -a alias_name
mengembalikan sesuatu sepertialias_name is aliased to command_within_quotes
. Ngomong-ngomong, saya sudah mencoba perintah Anda dan tidak bekerja di ubuntu saya :-(. Apakah ini kembalinyatype -a
perbedaan antara versi linux? (Saya ragu).type
terjadibash
. Anda mengerti, bahwa tanda kutip digandakan, bukan? Sudahkah Anda mencobanya dengan alias yang berisi tanda kutip tunggal? Lagi pula, Anda benar tentang hal saya tidak berfungsi - Anda perlueval "sudo sh -c "$(...
ataueval "'sudo $(alias alias_name| cut -d\' -f2-)"
. Masalahnya adalahalias
es pada dasarnya sudah diatur sebelumnyaeval
-alias
utilitas ditentukan untuk menampilkan kontennya sehingga dapat dengan aman di-instal kembali ke shell. Saya kira Andaxargs
diimplementasikan kemudian untuk meratakan ruang putih? Berhati-hatilah dengan itu, ok?