Banyak perintah dalam alias untuk bash

211

Saya ingin mendefinisikan alias yang menjalankan dua perintah berikut secara berurutan.

gnome-screensaver
gnome-screensaver-command --lock

Saat ini saya sudah menambahkan

alias lock='gnome-screensaver-command --lock'

ke .bashrc saya tetapi karena saya mengunci workstation saya begitu sering akan lebih mudah untuk hanya mengetik satu perintah

yuriel
sumber

Jawaban:

391

Mencoba:

alias lock='gnome-screensaver; gnome-screensaver-command --lock'

atau

lock() {
    gnome-screensaver
    gnome-screensaver-command --lock
}

di .bashrc Anda

Solusi kedua memungkinkan Anda menggunakan argumen.

mouviciel
sumber
7
bukankah seharusnya itu "fungsi kunci () {blah}"?
emeraldjava
2
Bagaimana Anda menyampaikan argumen? Variabel bersarang 'msg' di dalam lock()tanda kurung memberikan syntax error near unexpected token pesan kesalahan '' ..
geotheory
8
Setelah fungsi telah didefinisikan, ia berperilaku seperti perintah: argumen berada di baris perintah, dipisahkan oleh spasi putih. Pada bagian deklarasi, argumennya adalah $1, $2... di badan fungsi.
mouviciel
1
Downvote untuk tidak menyertakan baris alias untuk dengan params.
Philip Rego
2
@ PhilipRego - Saya akan senang belajar dari Anda dan meningkatkan jawaban Anda.
mouviciel
79

Jawaban lain menjawab pertanyaan dengan cukup, tetapi contoh Anda terlihat seperti perintah kedua tergantung pada yang pertama berhasil keluar. Anda mungkin ingin mencoba evaluasi hubung singkat di alias Anda:

alias lock='gnome-screensaver && gnome-screensaver-command --lock'

Sekarang perintah kedua bahkan tidak akan dicoba kecuali yang pertama berhasil. Deskripsi yang lebih baik dari evaluasi hubung singkat dijelaskan dalam pertanyaan SO ini .

gpojd
sumber
5
Anehnya, mencoba ini dengan git fetch && git pull origin masterdan tidak bekerja untuk saya sampai saya diganti &&dengan ;.
hakunin
3
Mungkin karena git fetch mengembalikan sesuatu selain 0?
RobAu
Membantu Bekerja untuk saya di Xubuntu 16.04.3
Fernando León
Downvote untuk tidak menyertakan baris alias untuk dengan params.
Philip Rego
18

Alias ​​dimaksudkan untuk alias nama perintah. Apa pun di luar itu harus dilakukan dengan fungsi.

alias ll='ls -l' # The ll command is an alias for ls -l

Alias ​​adalah nama yang masih dikaitkan dengan nama asli. llhanya jenis yang agak spesifik ls.

d() {
    if exists colordiff; then
        colordiff -ur "$@"
    elif exists diff; then
        diff -ur "$@"
    elif exists comm; then
        comm -3 "$1" "$2"
    fi | less
}

Fungsi adalah perintah baru yang memiliki logika internal. Itu bukan hanya mengubah nama perintah lain. Itu operasi internal.

Secara teknis, alias dalam bahasa shell Bash sangat terbatas dalam kemampuan sehingga mereka sangat tidak cocok untuk apa pun yang melibatkan lebih dari satu perintah . Gunakan mereka untuk membuat mutasi kecil dari satu perintah, tidak lebih.

Karena tujuannya adalah untuk membuat perintah baru yang melakukan operasi yang akan diselesaikan secara internal pada perintah lain, satu-satunya jawaban yang benar adalah dengan menggunakan fungsi di sini:

lock() {
    gnome-screensaver
    gnome-screensaver-command --lock
}

Penggunaan alias dalam skenario seperti ini mengalami banyak masalah. Berlawanan dengan fungsi, yang dieksekusi sebagai perintah, alias diperluas ke perintah saat ini, yang akan menyebabkan masalah yang sangat tidak terduga saat menggabungkan alias "perintah" ini dengan perintah lain. Mereka juga tidak bekerja dalam skrip.

lununath
sumber
Akan lebih baik jika Anda bisa memberikan contoh dengan jawaban Anda. menunggu pembaruan.
Sajid Ali
1
Downvote untuk tidak menyertakan baris alias untuk dengan params.
Philip Rego
2
Alias ​​@PhilipRego tidak menggunakan parameter. Jangan memilih apel karena tidak oranye. Makanlah jeruk sebagai gantinya. Sebagai jawaban menjelaskan dengan sangat baik, alat yang tepat di sini bukan alias tetapi berfungsi.
lhunath
Maksud saya parameter seperti ini. Saya menggunakan kutipan bersarang salah. alias = "git commit -m 'init'; git push; git status"
Philip Rego
@ PhilipRego Anda benar-benar perlu menggunakan fungsi, bukan alias. gps() { git commit -m 'init '; git push; git status; } Seperti yang dijelaskan, alias sangat terbatas, rapuh dan satu-satunya maksud mereka adalah mengubah nama perintah. Melecehkan mereka untuk tujuan yang tidak berhubungan akan membuat Anda jatuh dalam air panas, seperti yang baru saja Anda alami.
lhunath
11

Apakah ini tidak berhasil?

alias whatever='gnome-screensaver ; gnome-screensaver-command --lock'
Sean Bright
sumber
4

Ini akan menjalankan 2 perintah satu demi satu:

alias lock='gnome-screensaver ; gnome-screensaver-command --lock'
Adnan
sumber
1

Jadi gunakan titik koma:

alias lock='gnome-screensaver; gnome-screen-saver-command --lock'

Ini tidak berfungsi dengan baik jika Anda ingin memberikan argumen ke perintah pertama. Atau, buat skrip sepele di direktori $ HOME / bin Anda.

Jonathan Leffler
sumber
0

Menambahkan 2 sen saya ke diskusi berusia 11 tahun coba ini:

alias lock="gnome-screensaver \gnome-screensaver-command --lock"

Neenus
sumber
0

Tambahkan fungsi ini ke Anda ~/.bashrcdan mulai ulang terminal Anda atau jalankansource ~/.bashrc

function lock() {
    gnome-screensaver
    gnome-screensaver-command --lock
}

Dengan cara ini kedua perintah ini akan berjalan setiap kali Anda masuk lockke terminal Anda.

Dalam kasus spesifik Anda membuat aliasmungkin berhasil, tapi saya tidak merekomendasikannya. Secara intuitif kami akan berpikir nilai alias akan berjalan sama seperti jika Anda memasukkan nilai di terminal. Namun bukan itu masalahnya:

Aturan tentang definisi dan penggunaan alias agak membingungkan.

dan

Untuk hampir setiap tujuan, fungsi shell lebih disukai daripada alias.

Jadi jangan gunakan alias kecuali Anda harus melakukannya. https://ss64.com/bash/alias.html

Philip Rego
sumber
-3

Saya mendapat masalah saat mendeklarasikan alias ~/.bashrc. Terminal saya tidak mengenali alias yang saya nyatakan ~/.bashrc. Saya belajar dari artikel (terlampir di bagian bawah) bahwa Mac OS X dijalankan login-shellsecara default karena itu ia memanggil ~/.bash_profilebukan ~/.bashrc.

Jika Anda mengalami masalah yang sama dalam mendeklarasikan alias Anda, Anda bisa merujuk ke tautan berikut untuk menyelesaikan masalah:

http://www.joshstaiger.org/archives/2005/07/bash_profile_vs.html

ToleLee
sumber
QA ini adalah tentang beberapa perintah dalam alias, bukan tempat untuk meletakkan alias.
facuq
Saya selalu melakukan source .bashrcsetelah menyimpan perubahan pada file, untuk memungkinkan alias untuk dikenali tanpa keluar.
Scott Fleming