Fish-shell: && tidak berfungsi

Dibuat pada 19 Jun 2012  ·  98Komentar  ·  Sumber: fish-shell/fish-shell

cd .. && pwd mengembalikan kesalahan berikut:

fish: Expected a command name, got token of type 'Run job in background'. Did you mean 'COMMAND; and COMMAND'? See the help section for the 'and' builtin command by typing 'help and'.
cd .. && pwd

Jelas saya dapat menggunakan sintaks COMMAND; and COMMAND , tetapi alangkah baiknya jika ikan mendukung ini.

Terima kasih!

enhancement

Komentar yang paling membantu

|| juga akan menyenangkan.

Semua 98 komentar

|| juga akan menyenangkan.

Saya hanya ingin menyampaikan pendapat alternatif.
'||' dan '&&' adalah elemen sintaks, sedangkan 'dan' dan 'atau' adalah perintah sederhana. Pendekatan ini sederhana dan bersih.
Saya pikir itu bukan ide yang baik untuk memperkenalkan elemen sintaks tambahan untuk mengimplementasikan kemampuan yang sudah ada.
Ini berbeda dari bash, tapi tidak apa-apa.

Saya juga akan memilih untuk memiliki && dan || karena ini adalah gula sintaksis yang umum digunakan dan akan sangat menyenangkan untuk memiliki kegunaannya.

+1 untuk saran maxfl.

+1 untuk saran maxfl.

Ruby juga memiliki kata kunci and dan or .

+1

Saya tidak keberatan jika seseorang ingin mengambil ini.

-1 untuk menerapkan &&/|| dan +1 untuk maksfl. Dan saya tidak benar-benar melihat alasan mengapa itu harus diterapkan. Ini bukan gula sintaksis, di bash itu hanya sintaks dan di ikan sintaks ini tidak ada. Ini juga akan sangat tidak berguna karena gula sintaksis seperti ';atau' membutuhkan penekanan tombol yang sama persis dengan '||'.

Saya suka kesederhanaan perintah and dan or , tetapi satu masalah adalah mereka membuat pernyataan if menjadi aneh. Sebagai contoh:

if begin ; [ a = b ] ; and [ c = d ] ; end
   ...

dibandingkan dengan

if [ a = b ] && [ c = d ]
    ...

Adakah yang punya ide untuk meningkatkan itu?

if test a = b -a c = d # or [ ] syntax, but I didn't particularly liked it
    ...

Tetapi sementara itu berfungsi untuk test bawaan, itu tidak berfungsi di tempat lain. Mari kita asumsikan bahwa a dan b bawaan harus mengembalikan true untuk menjalankan c dan d . Kemudian, kita bisa menulisnya seperti itu.

and b
and begin
    c
    d
end

Atau dengan sintaks blok dan if .

if begin
        a
        and b
    end
    c
    d
end

Atau buat kondisi bersarang.

if a
    if b
        c
        d
    end
end

Kemudian lagi, saya tidak yakin seberapa sering peretasan ini diperlukan, tetapi searchco.de mengatakan bahwa && sebagian besar digunakan dengan test bawaan (atau untuk efek samping).

Saya tidak begitu yakin apakah fish akan membutuhkan sintaks lain yang berguna hanya dalam kasus yang jarang terjadi. Rasanya sudah seperti [ , kecuali yang satu harus tetap karena itu biner (seperti test ). Rasanya tidak terlalu mencurigakan, tetapi ada di sini, karena ini biner (tidak seperti [[ yang saya senang tidak didukung oleh ikan).

Memiliki dua sintaks (atau dalam hal ini, bahkan tiga) akan agak membingungkan. Sintaks mana yang harus saya gunakan?

if a
    b
end
a; and b
a && b

Sepertinya && terpendek, kecuali itu setengah dari kebenaran. Mengetik ;and membutuhkan jumlah penekanan tombol yang persis sama (karena & melibatkan Shift). Menambahkan && akan mendorong penambahan menambahkan sintaks tambahan (sekali lagi, and diuraikan dengan cara khusus, karena Anda dapat memasukkan kata kunci seperti begin setelahnya, dan kata kunci tersebut berfungsi).

Masalahnya adalah kita memiliki sintaks ; and dan ; or - sintaks baru akan terasa seperti duplikat. Mereka sudah agak ajaib (mereka bukan hanya fungsi skrip shell yang memeriksa variabel $status ), jadi saya tidak akan memiliki masalah jika mereka akan diganti dengan && dan || .

Saya tidak yakin harus berpikir apa. Saya pikir seharusnya hanya ada satu sintaks untuk melakukannya. Saya suka ; and dan ; or , tetapi saya tidak akan memiliki masalah dengan && dan || , asalkan sintaks lama akan dihapus. Tetapi mempertimbangkan kompatibilitas mundur, saya lebih suka tetap menggunakan ; and dan ; or . Mungkin jika begin akan lebih pendek (seperti kawat gigi di bash)... tapi itu tidak akan terasa mencurigakan.

Mengapa tidak mendukung [[ seperti bash? Itu akan lebih cepat (lihat: gema bawaan) dan itu akan mendukung && dan || operator dalam [[ dan ]] untuk meniru dan/atau perilaku.

Karena [[ bukan perintah yang sebenarnya, itu hanya ada di bash. Masalahnya adalah [[ sama seperti [ (kebanyakan), kecuali ia memiliki aturan penguraian khusus untuk menghindari kutipan yang tidak perlu. Lihat hukum ortogonalitas dan hukum dapat ditemukan untuk melihat mengapa hal itu tidak ada pada ikan.

Faktanya, saya hampir yakin [ tidak akan ada karena hukum dapat ditemukan dan hukum ortogonalitas, tetapi itu terjadi karena biner dalam /usr/bin . test lebih mencurigakan, karena Anda dapat menemukannya menggunakan penyelesaian tab. Tetapi memblokir binari akan agak sewenang-wenang, jadi sebaiknya implementasikan sebagai bawaan.

Misalnya, di bash [[ secara otomatis mengutip semua string.

[[ abc = $variable ]]

Tapi itu tidak diperlukan pada ikan karena perilaku pemisahan spasi tidak ada. Juga, secara otomatis mengutip && , || , < , dan > karena fitur sintaksisnya. Pada ikan, && adalah -a , || adalah -o . < dan > bahkan tidak ada.

Itu juga memiliki operator =~ . Di fish , Anda dapat menggunakan quiet grep untuk itu.

echo $ANSWER | grep -qE '^y(es)?$'

Juga, bash memiliki < dan > operator. Mereka memeriksa string apa pun yang lebih besar atau lebih kecil dari string lainnya. Ini jarang berguna.

Dan, saat menggunakan operator = dan != Anda dapat menggunakan sintaks globing, sama seperti Anda menggunakan ekspresi reguler. Sekali lagi, gunakan grep yang tenang untuk itu.

[[ abc = a* ]]

Juga, [[ didefinisikan memiliki -e , -nt , -ot , -ef , dan ! , tetapi ikan sudah memiliki ini di test bawaan.

Menambahkan [[ hanya akan menambahkan kata kunci lain, yang tidak akan benar-benar dapat ditemukan, dan tidak akan benar-benar menambah banyak fungsi. Satu-satunya fungsi yang menarik adalah =~ , tetapi quiet grep (atau Perl) dapat melakukan hal yang sama, tanpa menambahkan sintaks baru. Selain itu, kita tidak harus menambahkan semuanya ke shell. Saya tidak berpikir kita perlu memiliki ekspresi reguler bawaan.

Yah, saya tidak bermaksud bahwa kita harus mengimplementasikan kembali [[ bash, melainkan, itu harus diperkenalkan sebagai konstruksi sintaksis dengan propertinya sendiri. Maksud saya, ikan berbagi banyak kata kunci dan konstruksi yang terlihat seperti bash, tetapi mereka berbeda, jadi, saya tidak melihat bagaimana ini tidak akan terjadi.

Meskipun, berdasarkan apa yang Anda katakan, mungkin mengimplementasikan test kita sendiri akan menjadi konstruksi yang lebih baik, meskipun, diganti namanya menjadi sesuatu seperti cond , seperti bagaimana fish mengimplementasikan math builtin sebagai gantinya dari expr . Kami bahkan dapat menerapkan hal-hal seperti < dan >, namun, menggunakan penyortiran alami (numerik) alih-alih pengurutan leksikografis, sehingga akan bekerja pada angka dan juga string.

@Undeterminant builtin [[ vs builtin [ vs /bin/[ perbedaan halus sudah membingungkan di bash; tolong jangan memperburuknya dengan menambahkan bash-[[ vs fish-[[ perbedaan halus!
Juga, semangat [[ bash melanggar hukum ortogonalitas — itu "memperbaiki" dan/atau tetapi hanya untuk kondisi tertentu yang didukung oleh konstruk.

Sungguh ironis bahwa if commands...; then ...; fi bash akan dengan mudah menerima ikan dan/atau antara if...then . Tapi kami tidak ingin "kemudian". Mungkin hal yang harus diperbaiki adalah membuat awal...akhir lebih mudah.

Ini ide yang aneh (saya sama sekali tidak yakin saya menyukainya):

if (foo; and bar)
  ...
end

Saat ini (...) pada awal perintah adalah ilegal; pembacaan alami adalah menjalankan ini dan menggunakan output sebagai nama perintah tetapi kami memerlukan eval untuk itu.
Jika kami yakin kami tidak akan pernah mengizinkan pembacaan itu secara langsung, kami dapat menggunakan kembali bare (...) menjadi begin ...; end .
Tidak menangkap stdout dalam posisi ini tidak konsisten — tetapi terlihat sangat ringkas dan bersih.

Apa yang saya benci tentang itu adalah bahwa if (...) memohon arti lain: lakukan tangkap output dan tetapkan beberapa interpretasi boolean. Misalnya if (math 2 \< 4)math tidak mengembalikan status, ia mencetak 0 atau 1 ke stdout. Salah satu kegunaan penting adalah if $saved_bool .
Saya rasa ini tidak praktis — tidak ada penetapan hak tunggal makna boolean ke string, terutama karena 0/1 sangat membingungkan. Tetapi ketika Anda pertama kali menemukan if (...) , tampaknya tebakan yang masuk akal.

Demi kompatibilitas, berikan operator umum yang ditemukan di bash dan zsh. Semakin mudah bagi pengguna baru untuk menyalin dan menempelkan sebagian besar fungsionalitas cangkang sebelumnya, semakin baik tingkat penyerapan ikannya. Saya menemukan bahwa sementara saya lebih menyukai ikan dalam banyak hal, beberapa rintangan kecil yang konyol ini hanya membuatnya lebih merepotkan daripada keuntungan ketika datang dengan lebih dari 15 tahun penyesuaian shell yang seharusnya tidak menjadi masalah untuk didukung. .

Sejujurnya saya tidak melihat && sebagai "rintangan kecil yang konyol." Tidak akan sulit untuk mempelajarinya jika Anda memperlakukan ikan sebagai bahasanya sendiri alih-alih "cangkang pengganti" seperti zsh. Jika Anda membaca tutorial cara kerja ikan dari awal sampai akhir, saya rasa itu tidak sulit untuk dipahami.

Memiliki sesuatu seperti command1; and command2 memperjelas bahwa and adalah eksekusi bersyarat dari command2 dan bukan hanya gabungan antara command1 dan command2 .

Tapi @Undeterminant , Anda tidak melihatnya seperti kebanyakan orang melihatnya pertama kali ketika mereka pertama kali menemukannya, dll. Biarkan perasaan atau tingkat kemahiran itu datang seiring waktu. Misalnya, saya membawa ratusan baris dari konfigurasi lama dan sejujurnya saya tidak punya waktu untuk segera mengonversi semua yang perlu dikonversi. Saya menemukan keanehan di mana tidak ada nomor baris yang kembali dari ikan mengenai di mana masalah saya berada dalam konfigurasi lama saya.

Saya dapat memahami perspektif Anda, tetapi itu bias sehubungan dengan seseorang yang ingin membuat perubahan dan ingin melakukannya dari waktu ke waktu vs melewati punuk besar. Tolong jangan salah paham, jika saya tidak peduli dengan ikan dan dengan demikian mencoba memberi masukan, saya pasti akan kembali ke zsh sekarang. Saya merasa bahwa pemikiran dan penalaran semacam ini penting untuk membuka gerbang sedikit lebih jauh bagi para pendatang baru.

Jadi ya, Anda benar tentang keterbacaan, tetapi biarkan yang lama bekerja dan memberikan peringatan daripada kesalahan untuk menyapih orang.

@ylluminate Anda membodohi diri sendiri. Bahkan jika ikan mendukung && Anda masih tidak bisa hanya menggunakan konfigurasi Anda dari bash atau zsh, karena ada lebih banyak perbedaan pada sintaks skrip daripada hanya operator logika.

Tepat. ikan secara fungsional berbeda, yang berarti Anda tidak boleh hanya menyalin-tempel kode secara langsung. Jika kode Anda ditulis dalam bash, kecuali ada kebutuhan eksplisit untuk mengubahnya menjadi ikan, simpan saja sebagai bash; mereka bahasa yang terpisah.

Jadi
bila saya lakukan
perintah1 && perintah2
pada ikan itu menunjukkan bahwa sebagai gantinya saya mengetik
perintah1; dan perintah2

Apakah seseorang benar-benar percaya bahwa (di baris perintah) opsi kedua lebih bersih, lebih futuristik, dan lebih mudah diketik?

Ini lebih bersih, karena dibangun di atas sintaks yang ada untuk menjalankan perintah, daripada memperkenalkan sintaks baru.

Pertimbangkan di bash:

foo & bar # executes foo in the background, then bar in the foreground
foo && bar # executes foo in the foreground, then executes bar if foo has a zero exit status
foo & bar && baz & qux # left as an exercise for the reader

Ini adalah jenis omong kosong yang ingin kami hindari dengan menggunakan perintah alih-alih sintaks khusus.

Keputusan desain ini pasti menimbulkan biaya, terutama dalam pernyataan if, yang harus kita coba kurangi. Tapi kita harus mendekatinya dari posisi "mari kita temukan cara untuk meningkatkan kualitas ikan dalam filosofi desainnya" daripada "mari kita temukan cara untuk membuat ikan lebih mirip cangkang lainnya."

Kode Anda melakukan hal berikut, kan (dengan asumsi Anda dapat menggunakan & dengan blok)?

foo &
if bar
    baz
end &
qux

Bagi saya, tampaknya dibuat-buat. Juga, jika sintaks & sangat membingungkan, mengapa tidak membuat background builtin, atau semacamnya?

Saya pikir itu memang argumen untuk menjadikan latar belakang sebagai bawaan, meskipun saya tidak mengusulkan agar kita benar-benar melakukannya.

Masalah dengan ; and dan ; or adalah interaksi yang buruk dengan pipa. condition; and echo stuff | grep stuff tidak berfungsi, sedangkan condition && echo stuff | grep stuff berfungsi. Saya tidak melihat jalan keluar dari masalah ini kecuali menambahkan sintaks khusus.

and echo stuff | grep stuff tampaknya bekerja untuk saya. Bisakah Anda menjelaskan bagaimana itu rusak?

@ridiculousfish inilah kasus yang saya temukan ketika mencoba ikan. Ekspresi or benar di luar pernyataan if tetapi (tampaknya?) salah ketika digunakan dalam pernyataan if. Kecuali saya kehilangan sesuatu di sini?

root@smogon-dev ~# test 0 = 1; or echo stuff | grep stuff
stuff
root@smogon-dev ~# echo $status
0
root@smogon-dev ~# if test 0 = 1; or echo stuff | grep stuff
                       echo Success
                   else
                       echo Failure
                   end
Failure

Bandingkan dengan bash:

~/smogon/bin$ [[ 0 == 1 ]] || echo stuff | grep stuff
stuff
~/smogon/bin$ echo $?
0
~/smogon/bin$ if [[ 0 == 1 ]] || echo stuff | grep stuff; then
> echo Success
> else
> echo Failure
> fi
stuff
Success

Pada kasus ini:

if test 0 = 1; or echo stuff | grep stuff

mungkin lebih jelas jika ditulis seperti ini:

if test 0 = 1
    or echo stuff | grep stuff
    ...

Pernyataan or ada di badan if! Karena boolean adalah perintah, mereka tidak memiliki prioritas khusus.

Anda dapat menggunakan awal/akhir sebagai "kurung":

if begin; test 0 = 1; or echo stuff | grep stuff ; end
    ...

Jadi saya pikir itu tidak terkait dengan pipa, tetapi lebih diutamakan.

Seperti yang Anda lihat di bug ini, ada banyak pendapat tentang apakah ikan harus mendukung operator boolean :)

jadi, terima kasih teman-teman untuk energi yang dimasukkan ke sini.

Niat saya bukan membawa diskusi tentang hal mana yang lebih baik atau tidak. Ini hanya hal yang praktis.
Seperti kebanyakan dari Anda, saya memiliki skrip sendiri untuk dijalankan. Bahkan dalam hal-hal yang sangat sederhana kondisi && menjamin keberhasilan perintah (keluar 0), sementara ";" jalani saja tanpa peduli apapun yang terjadi. Benar? Jadi, mereka tidak sama sama sekali. Saya harap kita semua sepakat tentang ini. :)

Jadi, saya memiliki skrip saya dan tidak ada yang berfungsi dengan ikan. Ya, saya banyak menggunakan &&. Tetapi ini juga terjadi dengan kedamaian kode apa pun melalui internet dengan bash, umumnya menggunakan && juga. Singkatnya, masalahnya adalah saya tidak dapat menggunakan kode saya lagi! :D

Saya bertanya-tanya ... Apakah mungkin untuk membuat fungsi atau definisi dalam file konfigurasi ikan untuk memperbaiki perilaku ini HANYA (artinya hanya &&) dan mengembalikannya seperti di bash tradisional? Apa itu mungkin? Masuk akal? Bisa dilakukan?

Sekali lagi, saya setuju bahwa penggunaan "dan" mungkin lebih baik, lebih jelas. Tetapi itu tidak berfungsi dengan kode saya atau, secara umum, dengan kode bash pemula di atas. Jadi alih-alih mengubah kode yang sudah tertulis menggantikan && (... tidak akan terjadi... dan kemungkinan besar tidak akan berhasil) akan lebih mudah untuk membiarkan ikan memahami bash tradisional jika seseorang menginginkan, atau membutuhkan, bukan?

Semua yang terbaik, dan sekali lagi terima kasih atas usahanya!!

Pernahkah kita mendekati penuh pada compat dengan skrip bash / zsh ? Saya menyerah pada fish sesuai komentar saya sebelumnya karena saya tidak akan meluangkan waktu untuk mengubah semua infrastruktur yang telah saya bangun di lingkungan shell saya di begitu banyak workstation dan server. Akan senang untuk mencobanya lagi jika kita lebih dekat. Kalau tidak, saya hanya akan terus menjajakan tanpa itu. Terima kasih.

@rhoconlinux Mengubah Ikan untuk mendukung && tidak akan membuat skrip bash Anda berfungsi. Ada lebih banyak perbedaan dari itu.

Saya tidak mengerti jawaban Anda ^_^
Apakah mungkin untuk mendefinisikan alias atau fungsi untuk masalah &&?

@rhoconlinux Tidak, Anda harus memodifikasi pengurai Ikan (dalam C++). Maksud saya adalah, jika Fish mendukung && , skrip Bash Anda akan tetap gagal dijalankan, karena semua perbedaan lain antara Fish dan Bash.

@kballard aduh! hmmm.... miris banget dengernya. Aku mengerti sekarang. Sangat jelas. :)

Terima kasih atas tanggapannya yang super cepat. Saya akan menggunakan ikan untuk pengalaman sehari-hari yang lebih baik dan akan menyimpan terminal bash untuk barang-barang saya.

Bersulang! :+1:

Jika && menjadi perhatian, mudah untuk mengatasinya.

sed 's/&&/; and /' ~/.bashrc > ~/.config/fish/config.fish

Tapi sepertinya ini bukan satu-satunya hal yang perlu Anda lakukan. Yang Anda maksud adalah implementasi #522.

Saya akan mengatakan motivasi utama untuk && kompatibilitas tidak mengonversi yang sudah ada
basis kode tetapi salin-tempel dari internet.
Misalnya saya melihat beberapa cuplikan sudo add-apt-repo... && sudo apt-get update && sudo apt-get install ... , ingin hanya menyalin-menempel tetapi gagal.

Ini bukan sesuatu yang bisa kita selesaikan dengan pendidikan — akan selalu ada
snippet untuk ditempel, dan mereka akan menggunakan sintaks [ba]sh standar.
Dan && sejauh ini merupakan masalah #1 yang saya hadapi.
( export FOO=bar adalah #2 tetapi dapat diselesaikan dengan function export; set -x -g (echo $argv | sed 's/=/\n/'); end .)

Ini bukan masalah besar: Saya sudah terbiasa mengetik
bash , tempel, Ctrl+D.
Hmm, saya tergoda untuk menambahkan pintasan keyboard untuk menjalankan saat ini/sebelumnya
baris perintah di bawah bash.

Dua sen saya untuk masalah ini:
Saya sedang mengerjakan alat penyebaran (https://github.com/andres-montanez/Magallanes) yang membuat panggilan perintah shell, dan sebagian besar pengguna dan kontributor akan menggunakan shell bash. Jadi tentu saja, di sana-sini '&&' digunakan untuk menyatukan perintah.

Ada solusi yang jelas (seperti meneruskan semua perintah secara eksplisit ke bash)
Tapi itu membawa sejumlah poin rasa sakit. Untuk satu, mungkin ada efek samping yang aneh (yaitu PATH dan variabel lain tidak didefinisikan dengan cara yang sama), itu berarti meretas beberapa bagian inti alat untuk tujuan tunggal itu, dan saya perlu menggabungkan perbaikan saya dari versi ke versi setiap saya update.

&& hanyalah salah satu dari banyak fitur bash yang tidak kompatibel dengan ikan, tetapi ini mungkin yang paling dasar dan sering digunakan. Misalnya alat di atas ada di PHP, jadi apa pun kompleks middy dilakukan di PHP dan hanya perintah sistem dasar yang diteruskan ke shell. Menekan ketidakcocokan sintaks dengan kasus penggunaan minimal seperti itu membuat frustrasi.

Saya sepenuhnya setuju dengan apa yang @cben katakan && menurut saya adalah kasus khusus karena ada ratusan cuplikan kode online di mana satu-satunya perbedaan antara salin dan tempel atau tidak adalah dukungan untuk && .
Meskipun saya setuju, penting untuk mempertimbangkan bagaimana fish maju dalam hal sintaks, dll. Saya pikir ini adalah sesuatu yang akan membuat begitu banyak kehidupan pengembang yang menggunakan atau ingin menggunakan ikan menjadi lebih mudah. Saya tahu ini kelihatannya seperti penggantian sederhana && dengan ; and tetapi selalu mengganggu dan membuatnya merasa sedikit canggung ketika saya memberi tahu orang lain betapa menakjubkannya ikan itu tetapi kemudian saya harus bermain-main dan mengubah beberapa kata kunci, mereka biasanya bertanya-tanya mengapa saya harus mengubah hal yang begitu sederhana. Kemudian saya harus membela ikan dan itu bukan alasan yang bagus untuk mempromosikan ikan.
Terkadang hal yang paling sederhana yang dapat memiliki dampak terbesar.
Jadi singkatnya, saya setuju untuk mengizinkan sintaks bash && .

Saya setuju dengan apa yang dikatakan @Globegitter dan @cben . Sejumlah besar skrip dan program bergantung pada && dan || . Saya menggunakan shell ikan di workstation saya dan akan menyenangkan untuk memiliki kompatibilitas lintas-shell saat menulis skrip.

Mengingat bahwa ada banyak perbedaan signifikan antara skrip Fish dan skrip Bash selain && dan || , mengapa Anda semua yang berkomentar di sini percaya bahwa membuat Fish menerima && akan menjadi berarti? Jika Anda perlu menjalankan cuplikan kode Bash, jalankan saja bash , jalankan cuplikan, lalu keluar kembali ke Fish.

Saya pikir banyak orang ingin "mengubah" menjadi ikan, tetapi memiliki infrastruktur untuk dibawa. Saya, misalnya, memiliki 15 tahun skrip shell hanya di workstation saya (belum lagi server lain yang juga ingin saya gunakan untuk menjalankan ikan) yang tidak ingin saya habiskan untuk mengonversi. Saya tidak keberatan mengaduk-aduk dan membuat segala sesuatunya bekerja dengan "cara ikan" selama beberapa bulan, tetapi tidak mungkin saya dapat melakukan investasi awal semacam itu dalam alur kerja saya untuk mengubah ke shell lain.

Saya percaya bahwa ikan akan memiliki gelombang pengguna yang signifikan jika masalah kompatibilitas umum ditangani, tetapi tampaknya ini bukan sesuatu yang menjadi prioritas proyek dari apa yang dikatakan orang lain yang bekerja dalam pengembangan ikan. Saya terus memperhatikan hal ini karena alasan ini karena pada akhirnya saya ingin pindah ke memancing jika lanskap berubah dalam hal ini.

Sehubungan dengan hanya menjalankan bash atau zsh sesuai kebutuhan, itu akan menjadi jumlah yang signifikan untuk menjalankan shell itu dalam kasus saya dan itu konyol untuk menempuh jalan ini sebaliknya.

@kballard Saya memiliki alur kerja yang ideal untuk 95% skrip yang saya lakukan dengan ikan: cmd+C skrip yang sangat sederhana dari sumber lain, cmd+tab ke iTerm, cmd+v dan Enter. Hanya itu yang ingin saya lakukan, tidak ada tambahan bash atau apa pun, tidak ada yang lain. Seringkali satu-satunya hal yang menghentikan skrip ini bekerja dengan alur kerja yang tepat ini adalah, adanya hadiah && . Jadi itulah alasan mengapa bagi saya dan saya menganggap sebagian besar orang lain di sini menyelesaikan masalah ini akan sangat berguna.
Jika Anda tidak mengalaminya sendiri, percayalah itu bertambah dan benar-benar melekat di pikiran Anda jika alur kerja Anda sering terganggu.

Saya suka ikan untuk segala hal lainnya dan itulah sebabnya saya tidak dapat beralih kembali, tetapi hal sederhana inilah yang membuatnya tidak mengagumkan bagi saya dan saya menganggap beberapa yang lain di sini.

Ini dia. Setelah PR #1633 mendarat, Anda dapat mengambil yang berikut ini dan menyimpannya di ~/.config/fish/functions/fish_user_key_bindings.fish :

function handle_input_bash_conditional --description 'Function used for binding to replace && and ||'
    # This function is expected to be called with a single argument of either & or |
    # The argument indicates which key was pressed to invoke this function
    if begin; commandline --search-mode; or commandline --paging-mode; end
        # search or paging mode; use normal behavior
        commandline -i $argv[1]
        return
    end
    # is our cursor positioned after a '&'/'|'?
    switch (commandline -c)[-1]
    case \*$argv[1]
        # experimentally, `commandline -t` only prints string-type tokens,
        # so it prints nothing for the background operator. We need -c as well
        # so if the cursor is after & in `&wat` it doesn't print "wat".
        if test -z (commandline -c -t)[-1]
            # Ideally we'd just emit a backspace and then insert the text
            # but injected readline functions run after any commandline modifications.
            # So instead we have to build the new commandline
            #
            # NB: We could really use some string manipulation operators and some basic math support.
            # The `math` function is actually a wrawpper around `bc` which is kind of terrible.
            # Instead we're going to use `expr`, which is a bit lighter-weight.

            # get the cursor position
            set -l count (commandline -C)
            # calculate count-1 and count+1 to give to `cut`
            set -l prefix (expr $count - 1)
            set -l suffix (expr $count + 1)
            # cut doesn't like 1-0 so we need to special-case that
            set -l cutlist 1-$prefix,$suffix-
            if test "$prefix" = 0
                set cutlist $suffix-
            end
            commandline (commandline | cut -c $cutlist)
            commandline -C $prefix
            if test $argv[1] = '&'
                commandline -i '; and '
            else
                commandline -i '; or '
            end
            return
        end
    end
    # no special behavior, insert the character
    commandline -i $argv[1]
end

function fish_user_key_bindings
    bind \& 'handle_input_bash_conditional \&'
    bind \| 'handle_input_bash_conditional \|'
end

Ini mengikat & dan | dan membuatnya jadi mengetik && atau || secara otomatis menerjemahkannya ke dalam ; and / ; or , sehingga memungkinkan Anda untuk menempelkan baris formulir command one && command two dan membuatnya berfungsi.

Perhatikan bahwa hingga PR #1633 diterima, skrip ini akan berfungsi untuk _mengetik_ && / || tetapi tidak berfungsi untuk menempelkannya.

@kballard Wow, itu berita bagus! Terima kasih banyak.

Sepertinya ini tidak benar-benar menangani mode pencarian dengan benar (tidak yakin tentang mode pager; Saya tidak jelas apa sebenarnya yang terdiri dari itu). Menekan & atau | selama pencarian akan menghentikan pencarian. Yang mengatakan, saya tidak tahu bagaimana menangani itu.

Saya memperbarui skrip dengan perbaikan bug untuk mengetik | atau & dalam perintah multi-baris.

@kballard saya melihat bahwa PR telah mendarat. Jadi skrip yang Anda tempel di atas harus membuat && berfungsi dengan master terbaru?

Ya seharusnya. Cobalah dan beri tahu saya jika Anda memiliki masalah.

-Kevin

Pada 1 September 2014, pukul 1:14 pagi, Markus Padourek [email protected] menulis:

@kballard saya melihat bahwa PR telah mendarat. Jadi skrip yang Anda tempel di atas harus membuat && berfungsi dengan master terbaru?


Balas email ini secara langsung atau lihat di GitHub.

Saya mencoba skrip ini dengan versi 2.1.1 baru yang dirilis beberapa hari yang lalu, dan sepertinya tidak berhasil. Apakah saya harus menunggu sampai 2.2? Terima kasih!

@pragmattica : 2.1.1 adalah rilis perbaikan bug keamanan. Itu tidak menambahkan fitur baru.

@xfix : Oke. Terima kasih telah memberi tahu saya. Tidak bisa menunggu sampai 2.2!

LUAR BIASA :+1:

Apakah ada changelog yang berjalan? Tampaknya root CHANGELOG sudah ketinggalan zaman.

@pragmattica Sekarang ikan 2.2 keluar, saya mencobanya di ubuntu 14.04 dan echo 'test1' && echo 'test2'; berubah menjadi echo test1 &; and echo 'test2';

Mungkinkah ada masalah di suatu tempat dalam fish_user_key_bindings.fish ? (Saya akan mencoba memeriksanya sendiri, tetapi pengetahuan skrip ikan/bash saya agak goyah)

Sunting: Tampaknya berfungsi namun ketika Anda mengetikkan perintah dengan && . Mungkin sedikit menyenangkan jika itu terjadi di ruang angkasa setelahnya, tetapi itu tidak terlalu penting. Hebat setengahnya berfungsi :)

-1 ke simbol aneh :

if [[ a = b ]]; and [[ b = a ]]; or [[ c = b ]]; then echo hello; and echo world; done

+1 ke simbol sederhana :

if [[ a = b ]] && [[ b = a ]] || [[ c = b ]]; then echo hello && echo world; done

Aaahhh saya rasa saya tahu apa masalahnya @pragmattica perintah commandline mengembalikan buffer tanpa tanda kutip. Ya sepertinya begitu. Jadi setelah https://github.com/fish-shell/fish-shell/issues/2210 diperbaiki, skrip di atas juga harus diperbaiki.

Apakah ini masih mulai dipertimbangkan?

+1
Simbolnya tidak aneh, mereka biasanya digunakan untuk logika dalam banyak bahasa pemrograman.
Kompatibilitas salin dan tempel adalah argumen yang sangat nyata, dan yang saya dukung.

Saya akan menjadi orang jahat dan mengakhiri diskusi ini. Ini tidak akan dilaksanakan. Saya terutama terganggu oleh pernyataan berulang tentang keinginan untuk dapat "memotong dan menempelkan perintah dari skrip bash". Bahkan jika fish mendukung operator && dan || itu tidak akan memastikan Anda dapat dengan mudah memotong dan menempelkan pernyataan yang berisi operator tersebut. Kami tidak ingin memberi kesan bahwa Anda bisa melakukannya. Sejujurnya, jika Anda menginginkan sintaks dan perilaku bash/zsh, Anda harus menggunakan shell itu (atau alternatif yang mengklaim kompatibilitas dengannya).

Sebagian besar ide-ide lain yang dibahas harus memiliki masalah mereka sendiri. Secara khusus mungkin ada beberapa manfaat untuk menerapkan beberapa perilaku [[ ... ]] yang pertama kali diperkenalkan oleh ksh88 (bukan bash). Tetapi mungkin melalui peningkatan perintah test bawaan atau perintah baru daripada dengan mengimplementasikan token khusus tersebut.

Saya masih sangat terganggu dengan gagasan tidak mendukung zsh dan bash ini. Saya bisa mengerti logikanya, tapi saya tidak setuju dengan itu. Saya sangat tertarik dengan ikan beberapa waktu lalu, tetapi mundur karena pertentangan ini. Mungkin ada beberapa kesempatan untuk melakukan fork proyek di sini jika ada cukup banyak dari kita, sebagai pengembang, yang ingin melihat ini diimplementasikan. Sedih melihat perlawanan terus-menerus ini yang pada akhirnya menghambat momentum ke depan dan penerimaan karya yang begitu menarik.

@ylluminate apa yang Anda pikirkan dengan "mendukung zsh dan bash?" Tingkat kompatibilitas apa yang ingin Anda lihat?

Saya masih sangat terganggu dengan gagasan tidak mendukung zsh dan bash ini. saya bisa mengerti logikanya...

Saya khawatir saya tidak mengerti logika Anda karena memiliki fitur bash dan zsh yang mendukung ikan. Jika Anda ingin Java mengapa menggunakan C++? Jika Anda ingin Perl mengapa menggunakan Python? Seperti yang baru saja ditanyakan oleh

PS, saya telah memprogram untuk mencari nafkah sejak 1979 dan menggunakan UNIX sejak pertengahan 80-an. Saya telah menggunakan begitu banyak shell sehingga saya kehilangan hitungan (misalnya, Bourne, Csh, Ksh88, Ksh93, Bash, Zsh, Xonsh). Mengganti cangkang selalu membutuhkan pekerjaan (itulah sebabnya saya tidak melakukannya lebih dari sekali setiap lima tahun atau lebih). Ketika saya melakukannya, saya tidak mengeluh bahwa shell baru saya tidak menjalankan semua skrip lama saya tanpa perubahan.

@krader1961 Pidato yang bagus. Menurut pendapat saya yang sederhana ...

Saya tidak akan melakukan skrip pada ikan sepanjang waktu sebagai (diikuti oleh perintah):

  1. skrip ikan lambat (lebih lambat dari mksh)
  2. beberapa sintaks aneh (mis. ; and , ; or yang menurut saya jelek)
  3. tidak kompatibel dengan posix (saya dapat mengatakan sintaksnya mudah tetapi masih perlu waktu untuk belajar)

Yah, saya tidak akan peduli dengan 2 dan 3 hanya jika skrip ikan lebih cepat daripada cangkang lainnya (mis. mksh, bash).

Di sisi lain , saya menggunakan ikan karena:

  1. waktu startup lebih cepat dari zsh (tetapi lebih lambat dari bash)
  2. memiliki banyak fitur yang diaktifkan secara default (sorotan sintaks adalah yang terbaik)
  3. konfigurasinya bagus dan sederhana (terutama set -Ux )

@ylluminate Melihat

Jika Anda benar-benar mempertimbangkan bagaimana menerapkan && || ke ikan dan membuatnya tidak terlalu mencurigakan, maka Anda mungkin melihat bahwa Anda baru saja mengeluarkan begin; end (lihat apa yang dilakukan commit 594b460ba2d8dca59a3bfd282397c5f33aa9da6f,counter- ; and or memainkan peran ganda,sangat agak jelek) dan hanya mendapatkan sedikit gula.

@pickfire Bisakah Anda menguraikan "skrip ikan lambat?" Apakah ada tes yang membawa Anda ke kesimpulan itu?

FWIW dalam pengujian saya, ikan lebih cepat daripada bash secara keseluruhan, berdasarkan posix_spawn dan pengurai cepatnya, meskipun mungkin lebih lambat dalam kasus-kasus tertentu seperti alias .

ivan<strong i="5">@alarmpi</strong> /tmp> echo 'echo test' > script
ivan<strong i="6">@alarmpi</strong> /tmp> time bash script
test
0.02user 0.01system 0:00.03elapsed 96%CPU (0avgtext+0avgdata 2776maxresident)k
0inputs+0outputs (0major+149minor)pagefaults 0swaps
ivan<strong i="7">@alarmpi</strong> /tmp> time mksh script
test
0.00user 0.00system 0:00.02elapsed 0%CPU (0avgtext+0avgdata 1420maxresident)k
480inputs+0outputs (2major+82minor)pagefaults 0swaps
ivan<strong i="8">@alarmpi</strong> /tmp> time fish script
test
0.07user 0.01system 0:00.09elapsed 85%CPU (0avgtext+0avgdata 4204maxresident)k
352inputs+0outputs (2major+231minor)pagefaults 0swaps

@ridiculousfish Bayangkan saja itu sudah sangat lambat dibandingkan dengan yang lain hanya untuk satu echo .

@krader1961 @ridiculousfish IMO, setelah https://github.com/fish-shell/fish-shell/issues/2210 dirilis, ini dapat ditutup. Ada solusi yang sangat mudah yang diposting @kballard .

@pickfire Terima kasih telah berbagi. Tes itu mengukur overhead startup, bukan waktu echo . Waktu mulai sangat penting, tetapi Anda tidak dapat menarik kesimpulan di luar waktu mulai (yang sebagian besar bergantung pada config.fish) dari pengujian itu.

Berikut tolok ukur mikro yang berbeda:

> cat test.fish
for i in (seq 1000)
    ls > /dev/null
end

> time fish test.fish
        1.51 real         0.74 user         0.65 sys

> cat test.sh
for i in {1..1000} ; do
    ls > /dev/null
done

> time bash test.sh
        2.01 real         0.85 user         1.12 sys

di sini ikan menang banyak, tetapi ini terutama mengukur perbedaan fork vs posix_spawn.

Saya pikir satu kesimpulan di sini adalah bahwa kita membutuhkan rangkaian benchmark yang komprehensif.

@ridiculousfish Ini dia, patokan yang Anda berikan kepada saya:

> cat test.fish
for i in (seq 1000)
    ls > /dev/null
end
> time fish test.fish
4.18user 4.04system 0:22.62elapsed 36%CPU (0avgtext+0avgdata 4360maxresident)k
96inputs+0outputs (1major+321041minor)pagefaults 0swaps
> cat test.sh
for i in {1..1000} ; do
    ls > /dev/null
done
> time bash test.sh
0.70user 1.62system 0:09.81elapsed 23%CPU (0avgtext+0avgdata 2844maxresident)k
0inputs+0outputs (0major+154100minor)pagefaults 0swaps
> time mksh test.sh
0.00user 0.01system 0:00.04elapsed 24%CPU (0avgtext+0avgdata 1780maxresident)k
752inputs+0outputs (3major+203minor)pagefaults 0swaps

mksh tampaknya memiliki kecepatan yang mengesankan.

ls @pickfire fish adalah fungsi di Linux yang melakukan beberapa hal lain untuk membuat output lebih bagus, yang tidak dilakukan bash. Jika Anda ingin perbandingan apel-ke-apel di Linux, gunakan command ls . (Di Darwin, pembungkus ikan ls jauh lebih tipis - saya seharusnya menunjukkannya tetapi saya lupa.)

Penjelasan untuk "kecepatan mengesankan" mksh dalam pengujian Anda adalah bahwa mksh tidak memiliki ekspansi brace, jadi itu hanya menjalankan ls satu kali. Jelas memanggil ls sekali jauh lebih cepat daripada memanggilnya 1000 kali.

Ini menunjukkan bahwa pengukuran kinerja sangat rumit - sangat mudah untuk mengukur sesuatu yang berbeda dari apa yang Anda pikir Anda ukur!

@ridiculousfish , apakah ada alasan untuk menggunakan fungsi ls apakah skrip ikan dibandingkan dengan command ls ? Output tidak penting selama scripting.

Oke, kali ini saya melakukan apa yang Anda katakan:

> cat test.fish
for i in (seq 1000)
    command ls > /dev/null
end
> time fish test.fish
0.66user 1.04system 0:08.08elapsed 21%CPU (0avgtext+0avgdata 4364maxresident)k
624inputs+0outputs (4major+113176minor)pagefaults 0swaps
> cat test.sh
for i in $(seq 1000) ; do
    ls > /dev/null
done
> time mksh test.sh
0.21user 0.65system 0:07.64elapsed 11%CPU (0avgtext+0avgdata 1884maxresident)k
0inputs+0outputs (0major+119632minor)pagefaults 0swaps
> time bash test.sh
0.15user 1.04system 0:08.66elapsed 13%CPU (0avgtext+0avgdata 2816maxresident)k
0inputs+0outputs (0major+150700minor)pagefaults 0swaps

Pada akhirnya, mksh masih yang tercepat, sekarang saya merasa mengesankan karena fish lebih cepat dari mksh . Jika fish memiliki dukungan eksekusi perintah paralel bawaan, saya pikir itu akan menjadi yang tercepat.

Waktu pengguna 0,66 itu cukup tinggi. Saya berspekulasi itu karena konten config.fish Anda - mendefinisikan alias dan semacamnya. Sebagai catatan, inilah yang saya lihat di kotak Linux saya (terbaik dari 3 untuk masing-masing):

> time fish test.fish
0.15user 1.21system 0:01.33elapsed...
> time mksh test.mksh
0.12user 1.13system 0:01.24elapsed...
> time bash test.sh
0.18user 1.34system 0:01.47elapsed...

semua orang sangat dekat.

Mungkin menarik untuk benchmark apa pun untuk memasukkan semacam "oracular shell" yang hanya melakukan fork/exec atau posix_spawn ke beberapa perintah jalur, sehingga kita dapat mengetahui seberapa jauh kita dari kecepatan maksimum yang dapat diberikan oleh OS .

@ridiculousfish ,

# Solarized colors
test $SHLVL = 2
and sh $HOME/.config/base16-shell/base16-solarized.dark.sh &
set fisher_home ~/.local/share/fisherman
set fisher_config ~/.config/fisherman
source $fisher_home/config.fish

Yah karena mungkin menggunakan fisherman , tidak yakin apakah itu akan memperlambatnya. @bucaran adalah orang yang baik untuk ini. Kali ini, saya mengosongkan config.fish (hasil terbaik dari 5 percobaan):

> time fish test.fish; time mksh test.sh; time bash test.sh
0.62user 1.09system 0:07.28elapsed 23%CPU (0avgtext+0avgdata 4396maxresident)k
0inputs+0outputs (0major+108240minor)pagefaults 0swaps
0.21user 0.62system 0:06.92elapsed 11%CPU (0avgtext+0avgdata 1888maxresident)k
0inputs+0outputs (0major+116674minor)pagefaults 0swaps
0.29user 0.81system 0:07.78elapsed 14%CPU (0avgtext+0avgdata 2780maxresident)k
0inputs+0outputs (0major+145628minor)pagefaults 0swaps

@ridiculousfish @pickfire Bisakah Anda mengobrol di edisi lain sehingga saya dapat memblokir pesan Anda?

Ya, maaf telah mengirim spam ke masalah ini. @pickfire jika Anda ingin menindaklanjuti beberapa tolok ukur yang menurut Anda sangat menarik atau relevan, silakan buka edisi lain.

Tentang kompatibilitas bash dan zsh, saya pribadi tidak mengharapkan kompatibilitas penuh, tetapi dengan setiap kompatibilitas yang ditambahkan, ikan dapat menjadi lebih populer.
Bahkan tanpa memperhitungkan skrip, && dan || penting karena sangat umum digunakan untuk perintah berantai. Sebagai contoh saya masih memiliki masalah dengan #2292. Saya tahu itu bisa dianggap bukan kutu ikan, tetapi faktanya adalah meningkatkan kompatibilitas ikan akan memperbaikinya.

Saya dengan maxfl di sini, :-1: karena memiliki || dan && sebagai bagian dari sintaks ikan, jika ini seharusnya menjadi suara populer.

Ikan bukan bash (atau zsh). Tidak ada alasan kuat untuk mengimplementasikan && dan || selain untuk kompatibilitas dengan shell tersebut. Kompatibilitas dengan status-quo adalah anti-tujuan dari proyek ini.

@Nodd : Referensi Anda ke masalah #2292 sebenarnya adalah contoh mengapa ikan tidak boleh mengimplementasikan sintaks itu. Melakukannya akan menjadi langkah lain untuk membuat orang berpikir ikan adalah klon POSIX (bash, zsh, dll.). Itu hanya akan menciptakan tuntutan lain agar ikan berperilaku seperti cangkang di daerah lain.

Untuk semua orang yang mencari solusi, sejak ikan 2.3 saya dapat mengonfirmasi bahwa akhirnya ada solusi yang berfungsi penuh.

Lakukan saja apa yang disebutkan oleh jawaban di atas:

Ini dia. Setelah PR #1633 mendarat, Anda dapat mengambil yang berikut ini dan menyimpannya di ~/.config/fish/functions/fish_user_key_bindings.fish:

function handle_input_bash_conditional --description 'Function used for binding to replace && and ||'
    # This function is expected to be called with a single argument of either & or |
    # The argument indicates which key was pressed to invoke this function
    if begin; commandline --search-mode; or commandline --paging-mode; end
        # search or paging mode; use normal behavior
        commandline -i $argv[1]
        return
    end
    # is our cursor positioned after a '&'/'|'?
    switch (commandline -c)[-1]
    case \*$argv[1]
        # experimentally, `commandline -t` only prints string-type tokens,
        # so it prints nothing for the background operator. We need -c as well
        # so if the cursor is after & in `&wat` it doesn't print "wat".
        if test -z (commandline -c -t)[-1]
            # Ideally we'd just emit a backspace and then insert the text
            # but injected readline functions run after any commandline modifications.
            # So instead we have to build the new commandline
            #
            # NB: We could really use some string manipulation operators and some basic math support.
            # The `math` function is actually a wrawpper around `bc` which is kind of terrible.
            # Instead we're going to use `expr`, which is a bit lighter-weight.

            # get the cursor position
            set -l count (commandline -C)
            # calculate count-1 and count+1 to give to `cut`
            set -l prefix (expr $count - 1)
            set -l suffix (expr $count + 1)
            # cut doesn't like 1-0 so we need to special-case that
            set -l cutlist 1-$prefix,$suffix-
            if test "$prefix" = 0
                set cutlist $suffix-
            end
            commandline (commandline | cut -c $cutlist)
            commandline -C $prefix
            if test $argv[1] = '&'
                commandline -i '; and '
            else
                commandline -i '; or '
            end
            return
        end
    end
    # no special behavior, insert the character
    commandline -i $argv[1]
end

function fish_user_key_bindings
    bind \& 'handle_input_bash_conditional \&'
    bind \| 'handle_input_bash_conditional \|'
end

@Globegitter

Bagaimana dengan hanya?

function sudo_bang_bang --on-event fish_postexec
    abbr !! sudo $argv[1]
end

@brj Juga memasukkannya ke dalam ~/.config/fish/functions/fish_user_key_bindings.fish ? Itu sepertinya tidak berhasil bagi saya.

Anda perlu sumber fungsi ini. Jadi, pilihan Anda adalah memasukkannya ke dalam config.fish atau memasukkannya ke dalam ~/.conf.d/[name-dont-matter].fish.

@brj : Masalah yang salah untuk fungsi itu. Ini tentang "&&" dan "||", bukan "!!" - hal yang berbeda.

@faho lol, Anda benar. Saya selalu mendapat pemberitahuan dari masalah itu, jadi saya pikir ini adalah kasus lain dari sudo !!.

@Globegitter Maaf atas kebingungannya!

Bagaimana dengan mengirimkan solusi yang diusulkan dengan ikan sebagai contoh, sehingga pengguna dapat dengan mudah menyalinnya? Pesan kesalahan dapat dengan mudah ditambahkan untuk menyebutkan ini. Saya terus menempelkan satu liner yang sama (dari tinjauan kode gerrit) di mana && digunakan karena berfungsi di hampir semua shell (termasuk windows cmd.exe selain shell unix-y). Bagi saya skrip yang disebutkan di atas adalah penambah produktivitas (saya mengetik bash -c "tempel di sini" untuk sementara waktu ...).

Bagaimana saya melakukan && ? Apakah ada resolusi?

Masalah yang sama seperti di atas, saya benar-benar tidak dapat menemukan cara untuk melakukannya

gcc test2.c -o a.out && ./a.out

dalam ikan.

gcc test2.c -o a.out; and ./a.out

@ivan mencobanya, tetapi memberikan "dan" dan "./a.out" sebagai argumen untuk gcc.

//edit: Omong-omong, saya akhirnya menggunakan skrip bash, karena ini tampaknya sama sekali tidak mungkin di ikan :(

gcc test2.c -lwlc -o a.out && (( sleep 2s; DISPLAY=:2 xterm ) & ./a.out)

Saya cukup sering melakukan hal yang "benar-benar mustahil" ini. Mungkin coba sintaks ; and di lingkungan ikan yang bersih? Jika tidak berhasil, mungkin ada yang salah dengan titik koma Anda? Apakah Anda mengetik ini ke dalam ikan, atau itu diteruskan dari program lain?

@ivan Mengetiknya.

Maaf untuk pertanyaan yang mungkin bodoh, tetapi bagaimana cara membuat tanda kurung? Saya tidak dapat menemukan sepatah kata pun tentang mereka dalam dokumentasi dan itu bukan topik yang dapat di-google :(

gcc test2.c -lwlc -o a.out && (( sleep 2s; DISPLAY=:2 xterm ) & ./a.out)

@kozec Saya pikir Anda hanya mengalami kesulitan mengelompokkan item Anda bersama-sama di sini. Yang perlu Anda gunakan adalah begin seperti kurung kurawal kiri (begitulah menurut saya) dan end seperti kurung kurawal kanan.

gcc test2.c -lwlc -o a.out; and begin sleep 2s; env DISPLAY=:2 xterm; end & ./a.out

atau menjorok:

      gcc test2.c -lwlc -o a.out
         and begin sleep 2s
             env DISPLAY=:2 xterm
         end & ./a.out

@floam Terima kasih, itu hampir berhasil. Tapi barang sebelum & tidak dikirim ke latar belakang :(

Contoh minimal:

begin sleep 2s ; env DISPLAY=:2 xterm ; end & Xephyr :2

tidur 2 detik, lalu meluncurkan xterm, _then_ memulai XServer untuk xterm itu. xterm ofc lumpuh sebelum XServer menjadi siap.

Anda akan menemukan bahwa Anda dapat mengatasinya dengan ini di mana Anda harus, tidak cantik:

fish -c 'sleep 2s; env DISPLAY=:2 xterm' & Xephyr :2

Ketika Anda memiliki sejumlah besar skrip yang ada, untuk pengembangan, pembuatan, dan skrip run di dalam npm, tidak masuk akal untuk beralih, terutama karena beberapa/sebagian besar tidak aktif. Untuk skrip bash biasa dengan shebang dan semua itu tentu saja tidak masalah.

Hal yang bagus (atau "bagus") tentang && adalah ia bekerja pada shell biasa tidak hanya di Linux dan Mac tetapi juga bahkan Windows yang bagus untuk pengaturan cepat lingkungan dev dll.

Bukan pemecah kesepakatan dengan cara apa pun, tetapi agak sulit untuk melihat mengapa menambahkannya juga?

Yah, ini adalah argumen yang agak konyol untuk dimiliki. Mengapa tidak memiliki "mode" yang berbeda untuk kompiler ikan? Yaitu, semacam pengaturan yang dapat Anda aktifkan di mana Anda dapat memiliki barang ikan "murni" atau Anda dapat memiliki kompatibilitas dengan kerang seperti bash bersama dengan ikan-isme. Anda bahkan dapat memiliki "tingkat" kompatibilitas yang berbeda untuk shell lain sehingga Anda dapat memiliki kompatibilitas penuh, tidak ada kompatibilitas, atau sesuatu di antaranya. Maksud saya, pada tingkat dasar, Anda setidaknya dapat mengimplementasikan semacam kompiler sumber-ke-sumber untuk ini. Atau ambil kode bash dan terjemahkan ke representasi internal dan perantara untuk ikan. Anda dapat melakukan segala macam hal untuk penerjemahan dalam hal ini. Perbaiki saya jika saya salah, tetapi saya percaya bahwa konsep tingkat bahasa bash et al. vs ikan tidak sangat berbeda, kan?

Bagaimanapun, itu $0,02 saya untuk masalah ini yang benar-benar tampak konyol karena dibangun di atas premis:

"pure fish"
XOR
"compatibility with bash / becoming another bash clone"

ketika tidak ada yang mencegah jalan tengah di antara kedua gagasan ini.

Seseorang setidaknya harus menghadapi kenyataan bahwa cangkang seperti bash jauh lebih standar dan populer daripada cangkang esoteris seperti ikan sehingga harus ada semacam lapisan kompatibilitas untuk setiap peluang realistis ikan menjadi cangkang yang mampu bertahan. -to-toe dengan bash dalam hal tersebar luas dan tidak menyebabkan sakit kepala kompatibilitas.

...ketika tidak ada yang menghalangi jalan tengah di antara kedua gagasan ini.

Tidak lain adalah seseorang (atau sekelompok orang) yang menginvestasikan lebih dari 2.000 jam (satu orang per tahun) untuk menulis kode yang diperlukan. Saya berharap dapat meninjau permintaan tarik dari Anda, @ylluminarious , untuk mengimplementasikan semua itu. Apa yang Anda usulkan sama dengan menanyakan mengapa seseorang tidak dapat membuat Python juga menafsirkan PHP. Jawabannya adalah bahwa secara teoritis Anda dapat memiliki sakelar kompatibilitas untuk melakukannya, tetapi mengapa Anda melakukannya?

Diimplementasikan pada #4620.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat