Dalam kasus khusus ini, saya ingin menambahkan konfirmasi di Bash untuk
Apakah kamu yakin [Y / n]
untuk Mercurial hg push ssh://[email protected]//somepath/morepath
, yang sebenarnya adalah alias. Apakah ada perintah standar yang dapat ditambahkan ke alias untuk mencapainya?
Alasannya adalah bahwa hg push
dan hg out
dapat terdengar mirip dan kadang-kadang ketika saya inginkan hgoutrepo
, saya mungkin secara tidak sengaja mengetik hgpushrepo
(keduanya alias).
Pembaruan: jika bisa berupa perintah bawaan dengan perintah lain, seperti: confirm && hg push ssh://...
itu akan bagus ... hanya perintah yang bisa meminta yes
atau no
melanjutkan dengan sisanya jika yes
.
bash
alias
confirmation
nonopolaritas
sumber
sumber
info bash
: "Untuk hampir semua tujuan, fungsi shell lebih disukai daripada alias."ls -l
ataurm -i
?alias rm='rm -i'
. Suatu hari, ketika Anda sangat membutuhkannya, alias tidak akan ada di sana danboom!
sesuatu yang penting akan hilang.rm -i
, maka Anda tidak dapat mengandalkan memiliki skrip shell juga. Jadi, apakah Anda selalu mengetikrm -i
setiap waktu?rm
dan mengharapkan-i
perilaku, lalu suatu hari alias tidak ada di sana (untuk beberapa alasan itu menjadi tidak disetel atau tidak disetel atau Anda berada di sistem yang berbeda ) dan Anda mengetikrm
dan langsung menghapus hal-hal tanpa konfirmasi. Ups! Namun, jika Anda melakukan alias sepertialias askrm='rm -i'
maka Anda akan baik-baik saja, karena Anda akan mendapatkan kesalahan "perintah tidak ditemukan".Jawaban:
Ini adalah bentuk jawaban Hamish yang lebih ringkas dan serbaguna . Mereka menangani campuran huruf besar dan kecil:
Atau, untuk Bash> = versi 3.2:
Catatan: Jika
$response
string kosong, itu akan memberikan kesalahan. Untuk memperbaiki, cukup tambahkan tanda kutip:"$response"
. - Selalu gunakan tanda kutip ganda dalam variabel yang berisi string (mis: lebih suka menggunakan"$@"
bukan$@
).Atau, Bash 4.x:
Edit:
Menanggapi hasil edit Anda, inilah cara Anda membuat dan menggunakan
confirm
perintah berdasarkan versi pertama dalam jawaban saya (ini akan bekerja sama dengan dua lainnya):Untuk menggunakan fungsi ini:
atau
sumber
not equal to
contoh kedua, Anda harus menggunakan$response
variabel. Misalnya:if [[ ! $response =~ ^([yY][eE][sS]|[yY])$ ]]
.=~
adalah operator pertandingan regex.Ini kira-kira potongan yang Anda inginkan. Biarkan saya mencari tahu bagaimana meneruskan argumen.
Hati-hati
yes | command name here
:)sumber
Konfirmasi mudah dilewati dengan carriage return, dan saya merasa berguna untuk terus meminta input yang valid.
Inilah fungsi untuk membuatnya mudah. "input tidak valid" muncul dengan warna merah jika Y | N tidak diterima, dan pengguna diminta lagi.
Anda dapat mengubah prompt default dengan memberikan argumen
sumber
Untuk menghindari secara eksplisit memeriksa varian 'ya' ini, Anda dapat menggunakan operator ekspresi reguler bash '= ~' dengan ekspresi reguler:
Itu menguji apakah input pengguna dimulai dengan 'y' atau 'Y' dan diikuti oleh nol atau lebih dari itu.
sumber
Ini mungkin hack:
seperti dalam pertanyaan Di Unix / Bash, apakah "xargs -p" cara yang baik untuk meminta konfirmasi sebelum menjalankan perintah?
kita dapat menggunakan
xargs
untuk melakukan pekerjaan:tentu saja, ini akan ditetapkan sebagai alias, seperti
hgpushrepo
Contoh:
sumber
Tambahkan berikut ini ke file / etc / bashrc Anda. Skrip ini menambahkan "fungsi" penduduk alih-alih alias yang disebut "konfirmasi".
sumber
$response
dan$@
untuk menghindari misparses, ada beberapa titik koma yang berlebihan, dan*
kondisinya harus kembali, bukan keluar.Ini mungkin agak terlalu pendek, tetapi untuk penggunaan pribadi saya, ini bekerja dengan baik
Itu
read -n 1
hanya membaca satu karakter. Tidak perlu menekan enter. Jika bukan 'n' atau 'N', itu dianggap sebagai 'Y'. Hanya dengan menekan enter berarti Y juga.(adapun pertanyaan sebenarnya: buat skrip bash dan ubah alias Anda untuk menunjuk ke skrip itu alih-alih apa yang ditunjuk sebelumnya)
sumber
sumber
Tidak perlu menekan enter
Inilah pendekatan yang lebih panjang, tetapi dapat digunakan kembali dan modular:
0
= ya dan1
= tidakzsh
danbash
.Standarnya menjadi "tidak" saat menekan enter
Perhatikan bahwa
N
huruf kapital. Sini masuk ditekan, menerima default:Perhatikan juga, itu
[y/N]?
itu ditambahkan secara otomatis. Default "tidak" diterima, jadi tidak ada yang digaungkan.Konfirmasikan kembali hingga respons yang valid diberikan:
Default ke "ya" saat menekan enter
Perhatikan bahwa
Y
huruf kapital:Di atas, saya hanya menekan enter, jadi perintahnya berlari.
Tidak ada default enter- memerlukan
y
ataun
Di sini,
1
atau false dikembalikan. Perhatikan tidak ada huruf besar dalam[y/n]?
Kode
sumber
Nah, ini versi saya
confirm
, dimodifikasi dari versi James:Perubahan-perubahan ini adalah:
local
untuk mencegah nama variabel bertabrakanread
gunakan$2 $3 ...
untuk mengontrol aksinya, jadi Anda dapat menggunakan-n
dan-t
read
keluar dengan tidak berhasil,echo
berikan makan untuk kecantikanGit on Windows
hanya punyabash-3.1
dan tidak punyatrue
ataufalse
, jadi gunakanreturn
saja. Tentu saja, ini juga kompatibel dengan bash-4.4 (yang saat ini ada di Git untuk Windows).sumber
Versi ini memungkinkan Anda memiliki lebih dari satu kasing
y
atauY
,n
atauN
Opsional: Ulangi pertanyaan sampai pertanyaan yang disetujui diberikan
Opsional: Abaikan jawaban lain
Opsional: Keluar dari terminal jika Anda mau
Perhatikan ini juga: Pada baris terakhir dari fungsi ini, hapus variabel REPLY. Kalau tidak, jika Anda
echo $REPLY
akan melihatnya masih diatur sampai Anda membuka atau menutup terminal Anda atau mengaturnya lagi.sumber
Terlambat dalam permainan, tetapi saya membuat varian lain dari
confirm
fungsi jawaban sebelumnya:Untuk menggunakannya:
Fitur:
Bug:
echo -en
bekerja denganbash
tetapi mungkin gagal di shell Andaecho
atauxargs
sumber
Mencoba,
sumber
Ini sebenarnya bukan "meminta ya atau tidak" tetapi hanya peretasan: alias
hg push ...
tidak untukhgpushrepo
tetapi kehgpushrepoconfirmedpush
dan pada saat saya dapat menguraikan semuanya, otak kiri telah membuat pilihan yang logis.sumber
TAB
kuncinya!Tidak sama, tetapi ide itu tetap berhasil.
Output:
Lagi? Y / t
lagi? Y / n Ada
Lagi Lagi? Y / n 7
Lagi? Y / t &
Lagi? Y / n nsijf
$
Sekarang hanya memeriksa karakter pertama dari $ i baca.
sumber
Kode di bawah ini menggabungkan dua hal
shopt -s nocasematch yang akan menangani case-sensitive
dan jika kondisi yang akan menerima kedua input baik Anda lulus ya, Ya, YA, y.
shopt -s nocasematch
if [[sed-4.2.2. $ LINE = ~ (ya | y) $]]
lalu keluar 0
fi
sumber
Berikut adalah solusi saya yang menggunakan regex lokal. Jadi dalam bahasa Jerman juga "j" untuk "Ja" akan ditafsirkan sebagai ya.
Argumen pertama adalah pertanyaan, jika argumen kedua adalah "y" dari ya akan menjadi jawaban default, jika tidak, tidak akan menjadi jawaban default. Nilai baliknya adalah 0 jika jawabannya "ya" dan 1 jika jawabannya "tidak".
Ini adalah penggunaan dasar
sumber