Fish-shell: && funktioniert nicht

Erstellt am 19. Juni 2012  ·  98Kommentare  ·  Quelle: fish-shell/fish-shell

cd .. && pwd gibt den folgenden Fehler zurück:

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

Natürlich kann ich die Syntax COMMAND; and COMMAND , aber es wäre schön, wenn fish dies unterstützen würde.

Danke!

enhancement

Hilfreichster Kommentar

|| wäre auch schön.

Alle 98 Kommentare

|| wäre auch schön.

Ich möchte nur eine alternative Meinung äußern.
'||' und '&&' sind die Syntaxelemente, während 'and' und 'or' einfache Befehle sind. Dieser Ansatz ist einfach und sauber.
Ich denke, dass es keine gute Idee ist, zusätzliche Syntaxelemente einzuführen, um bereits vorhandene Fähigkeiten zu implementieren.
Es ist anders als bash, aber es ist in Ordnung.

Ich würde auch dafür stimmen, && und || . zu haben da dies häufig verwendeter syntaktischer Zucker ist und es in Bezug auf die Benutzerfreundlichkeit wirklich schön wäre.

+1 zum Vorschlag von maxfl.

+1 zum Vorschlag von maxfl.

Ruby hat auch die Schlüsselwörter and und or .

+1

Ich habe nichts dagegen, wenn das jemand übernehmen möchte.

-1 zum Implementieren von &&/|| und +1 bis maxfl. Und ich sehe nicht wirklich den Grund, warum es implementiert werden sollte. Es ist kein syntaktischer Zucker, in bash ist es nur die Syntax und in fish existiert diese Syntax nicht. Es wäre auch wirklich nutzlos, da syntaktischer Zucker wie ';or' genau so viele Tastenanschläge benötigt wie '||'.

Ich mag die Einfachheit der Befehle and und or , aber ein Problem ist, dass sie seltsame if-Anweisungen machen. Beispielsweise:

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

verglichen mit

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

Hat jemand Ideen um das zu verbessern?

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

Aber während das für test built-in funktioniert, funktioniert es nirgendwo anders. Nehmen wir an, dass die Builtins a und b true zurückgeben sollen, um c und d auszuführen. Dann könnten wir es so schreiben.

and b
and begin
    c
    d
end

Oder mit Blocksyntax und if .

if begin
        a
        and b
    end
    c
    d
end

Oder machen Sie verschachtelte Bedingung.

if a
    if b
        c
        d
    end
end

Andererseits bin ich mir nicht sicher, wie oft dieser Hack benötigt wird, aber searchco.de sagt, dass && hauptsächlich mit eingebauten test (oder für Nebenwirkungen) verwendet wird.

Ich bin mir nicht wirklich sicher, ob fish eine andere Syntax benötigen würde, die nur in seltenen Fällen nützlich ist. Es fühlt sich schon an wie [ , außer dass man bleiben musste, weil es sowieso binär ist (genau wie test ). Es fühlt sich nicht besonders faul an, aber es ist hier, weil es binär ist (im Gegensatz zu [[ das ich froh bin, dass Fish es nicht unterstützt).

Zwei Syntaxen (oder in diesem Fall sogar drei) zu haben, wäre ziemlich verwirrend. Welche Syntax soll ich verwenden?

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

Es sieht so aus, als ob && am kürzesten ist, aber das ist die halbe Wahrheit. Die Eingabe von ;and erfordert genau die gleiche Anzahl von Tastenanschlägen (da & die Umschalttaste beinhaltet). Das Hinzufügen von && würde das Hinzufügen zusätzlicher Syntax ermutigen (andererseits wird and auf eine besondere Weise geparst, da Sie Schlüsselwörter wie begin danach einfügen können und sie funktionieren).

Das Problem ist, dass wir die Syntaxen ; and und ; or - die neuen Syntaxen würden sich wie Duplikate anfühlen. Sie sind bereits irgendwie magisch (sie sind nicht nur eine Shell-Skriptfunktion, die die Variable $status überprüft), also hätte ich kein Problem, wenn sie durch && und || .

Ich bin mir nicht sicher, was ich denken soll. Ich denke, es sollte nur eine Syntax dafür geben. Ich mag ; and und ; or , aber ich hätte kein Problem mit && und || , vorausgesetzt, dass alte Syntaxen entfernt würden. Aber in Anbetracht der Abwärtskompatibilität würde ich es vorziehen, bei ; and und ; or zu bleiben. Vielleicht wäre begin kürzer (wie Klammern in Bash) ... aber das würde sich nicht faul anfühlen.

Warum nicht ein eingebautes [[ unterstützen, wie es die Bash tut? Es wäre schneller (siehe: eingebautes Echo) und es würde && und || . unterstützen Operatoren innerhalb von [[ und ]], um das und/oder Verhalten zu emulieren.

Da [[ kein eigentlicher Befehl ist, existiert er nur in bash. Das Problem ist, dass [[ genau wie [ (meistens), außer dass es spezielle Parsing-Regeln hat, um unnötige Anführungszeichen zu vermeiden. Sehen Sie sich das Gesetz der Orthogonalität und das Gesetz der Auffindbarkeit an, um zu sehen, warum es nicht in Fischen vorkommt.

Tatsächlich bin ich mir fast sicher, dass [ aufgrund des Gesetzes der Auffindbarkeit und des Gesetzes der Orthogonalität nicht existieren würde, aber es tut es, weil es in /usr/bin binär ist. test ist fauler, weil Sie es mit der Tab-Vervollständigung entdecken können. Aber das Blockieren von Binärdateien wäre ziemlich willkürlich, also könnte es genauso gut als eingebaut implementiert werden.

Zum Beispiel zitiert [[ in bash automatisch alle Strings.

[[ abc = $variable ]]

Aber das wird bei Fischen nicht benötigt, da das Whitespace-Splitting-Verhalten nicht existiert. Außerdem werden && , || , < und > automatisch zitiert, da es sich um eine syntaktische Funktion handelt. Bei Fisch ist && -a , || ist -o . < und > existieren nicht einmal.

Es hat auch den Operator =~ . In fish können Sie dafür quiet grep verwenden.

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

Außerdem hat bash die Operatoren < und > . Sie prüfen, welche Zeichenfolge größer oder kleiner als andere Zeichenfolgen ist. Dies ist selten sinnvoll.

Und wenn Sie die Operatoren = und != können Sie die globende Syntax verwenden, genau wie Sie reguläre Ausdrücke verwenden würden. Verwenden Sie dafür wieder quiet grep.

[[ abc = a* ]]

Außerdem ist [[ definiert als -e , -nt , -ot , -ef und ! , aber fish hat diese bereits in test eingebaut.

Das Hinzufügen von [[ würde nur ein weiteres Schlüsselwort hinzufügen, das nicht wirklich auffindbar wäre und nicht wirklich viele Funktionen hinzufügen würde. Die einzige interessante Funktionalität ist =~ , aber quiet grep (oder Perl) kann dasselbe tun, ohne eine neue Syntax hinzuzufügen. Außerdem sollten wir nicht alles zur Shell hinzufügen. Ich glaube nicht, dass wir reguläre Ausdrücke eingebaut haben müssen.

Nun, ich meinte nicht unbedingt, dass wir das eingebaute [[ bash neu implementieren sollten, sondern es sollte eher als syntaktisches Konstrukt mit eigenen Eigenschaften eingeführt werden. Ich meine, fish teilt viele Schlüsselwörter und Konstrukte, die wie die von Bash aussehen, aber sie sind unterschiedlich, also sehe ich nicht, wie dies nicht so sein sollte.

Obwohl, basierend auf dem, was Sie gesagt haben, die Implementierung unseres eigenen test vielleicht ein besseres Konstrukt wäre, obwohl es in etwas wie cond , wie wie fish stattdessen ein eingebautes math implementiert von expr . Wir könnten sogar so weit gehen, Dinge wie < und > zu implementieren, indem wir die natürliche (numerische) Sortierung anstelle der lexikographischen Sortierung verwenden, sodass sie sowohl für Zahlen als auch für Zeichenfolgen funktioniert.

@Undeterminant builtin [[ vs builtin [ vs /bin/[ feine Unterschiede sind bereits in der Bash verwirrend; bitte machen wir es nicht noch schlimmer, indem wir bash-[[ vs fish-[[ subtile Unterschiede hinzufügen!
Außerdem verstößt der Geist von bash [[ gegen das Gesetz der Orthogonalität – er "fixiert" und/oder nur für bestimmte Bedingungen, die das Konstrukt unterstützt.

Es ist ironisch, dass if commands...; then ...; fi bash leicht Fisch und/oder zwischen if...then zulassen würde. Aber wir wollen kein "dann". Vielleicht ist das Problem, das behoben werden muss, den Anfang ... das Ende einfacher zu machen.

Hier ist eine seltsame Idee (ich bin mir überhaupt nicht sicher, ob ich sie mag):

if (foo; and bar)
  ...
end

Derzeit ist (...) beim Start des Befehls illegal; das natürliche Lesen ist, dies auszuführen und die Ausgabe als Befehlsnamen zu verwenden, aber dafür benötigen wir eval .
Wenn wir sicher sind, dass wir dieses Lesen niemals direkt zulassen, könnten wir die bloßen (...) in begin ...; end .
Stdout in dieser Position nicht zu erfassen, ist inkonsistent – ​​aber sehr kompakt und sauber aussehend.

Was ich daran hasse, ist, dass if (...) um eine weitere Bedeutung bittet: Erfassen Sie die Ausgabe und weisen Sie ihr eine boolesche Interpretation zu. ZB if (math 2 \< 4)math gibt keinen Status zurück, sondern gibt 0 oder 1 auf stdout aus. Eine wichtige Verwendung wäre if $saved_bool .
Ich glaube nicht, dass dies praktisch ist – es gibt keine einzige richtige Zuweisung von booleschen Bedeutungen zu Strings, zumal 0/1 hoffnungslos verwirrt sind. Aber wenn Sie if (...) ersten Mal begegnen, scheint es eine vernünftige Vermutung zu sein.

Aus Kompatibilitätsgründen geben Sie bitte die üblichen Operatoren an, die in bash und zsh zu finden sind. Je einfacher es für neue Benutzer wird, die meisten ihrer vorherigen Shell-Funktionen zu kopieren und einzufügen, desto besser wird die Aufnahmerate von Fischen sein. Ich stelle fest, dass, obwohl ich Fisch in vielerlei Hinsicht besser mag, einige dieser albernen kleinen Hürden es eher zu einem Ärger als zu einem Vorteil machen, wenn man mit über 15 Jahren Shell-Anpassungen vorbeikommt, die wirklich kein Problem sein sollten zu unterstützen .

Ich sehe && ehrlich gesagt nicht als "alberne kleine Hürde". Es wäre nicht schwer zu lernen, wenn Sie Fisch als seine eigene Sprache behandeln würden und nicht als "Ersatzschale" wie zsh. Wenn Sie das Tutorial zur Funktionsweise von Fisch von Anfang bis Ende lesen, denke ich, dass das nicht schwer zu verstehen ist.

Etwas wie command1; and command2 macht deutlicher, dass and eine bedingte Ausführung von command2 und nicht nur eine Verbindung zwischen command1 und command2 .

Aber @Undeterminant , Sie sehen es nicht so, wie es die meisten Leute zuerst sehen, wenn sie es zum ersten Mal entdecken usw. Lassen Sie dieses Gefühl oder Niveau der Fähigkeiten mit der Zeit kommen. Ich habe zum Beispiel Hunderte von Zeilen aus der alten Legacy-Konfiguration übernommen und habe ehrlich gesagt keine Zeit, alles sofort umzuwandeln, was konvertiert werden muss. Ich finde Merkwürdigkeiten, bei denen keine Zeilennummer von Fisch zurückgegeben wird, in Bezug darauf, wo mein Problem in meinen alten Konfigurationen liegt.

Ich kann Ihre Perspektive verstehen, aber sie ist voreingenommen in Bezug auf jemanden, der die Änderung vornehmen möchte und dies im Laufe der Zeit tun möchte, anstatt über einen großen Buckel zu gehen. Bitte nicht falsch verstehen, wenn ich mich nicht für Fische interessieren würde und daher versuchen würde, Input zu geben, würde ich jetzt sicherlich einfach wieder auf zsh springen. Ich glaube, dass diese Art des Denkens und Argumentierens wichtig ist, um das Tor für Neuankömmlinge ein wenig weiter zu öffnen.

Also ja, Sie haben Recht in Bezug auf die Lesbarkeit, aber lassen Sie uns das Alte funktionieren und geben Sie lieber eine Warnung als einen Fehler, um die Leute zu entwöhnen.

@ylluminate Du machst dir was vor. Selbst wenn fish && , könnten Sie Ihre Konfiguration nicht einfach von bash oder zsh verwenden, da es mehr Unterschiede in der Skriptsyntax gibt als nur die logischen Operatoren.

Exakt. fish ist funktionell anders, was bedeutet, dass Sie den Code nicht einfach direkt kopieren und einfügen sollten. Wenn Ihr Code in bash geschrieben ist, es sei denn, es besteht eine ausdrückliche Notwendigkeit, ihn in Fisch zu konvertieren, behalten Sie ihn einfach als bash bei; das sind unterschiedliche Sprachen.

So
wenn ich mache
Befehl1 && Befehl2
bei Fisch schlägt es vor, dass ich stattdessen tippe
Befehl1; und Befehl2

Glaubt jemand wirklich, dass (in der Befehlszeile) die zweite Option sauberer, futuristischer und einfacher zu tippen ist?

Es ist sauberer, weil es auf der bestehenden Syntax zum Ausführen von Befehlen aufbaut, anstatt eine neue Syntax einzuführen.

Betrachten Sie in 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

Dies ist die Art von Unsinn, die wir hoffen, durch die Verwendung von Befehlen anstelle einer speziellen Syntax zu vermeiden.

Diese Designentscheidung verursacht definitiv Kosten, insbesondere bei if-Aussagen, die wir versuchen sollten, zu reduzieren. Aber wir sollten es von einer Position aus angehen, die „Möglichkeiten finden, Fische innerhalb ihrer Designphilosophie zu verbessern“ anstatt „Möglichkeiten zu finden, Fische ähnlicher zu machen wie andere Muscheln“.

Ihr Code macht Folgendes, richtig (vorausgesetzt, Sie können & mit Blöcken verwenden)?

foo &
if bar
    baz
end &
qux

Für mich wirkt es konstruiert. Wenn die Syntax von & so verwirrend ist, warum nicht background eingebaut machen oder so?

Ich denke, das ist in der Tat ein Argument dafür, den Hintergrund zu einem integrierten Element zu machen, obwohl ich nicht vorschlage, dass wir es tatsächlich tun.

Das Problem mit ; and und ; or ist, dass sie schlecht mit Pipes interagieren. condition; and echo stuff | grep stuff funktioniert nicht, während condition && echo stuff | grep stuff funktioniert. Ich sehe keinen Weg, dieses Problem zu umgehen, außer eine spezielle Syntax hinzuzufügen.

and echo stuff | grep stuff scheint bei mir zu funktionieren. Kannst du genauer beschreiben, wie es kaputt ist?

@ridiculousfish hier ist der Fall, den ich beim Ausprobieren von Fisch entdeckt habe. Der or-Ausdruck ist außerhalb der if-Anweisung wahr, aber (scheint zu sein?) falsch, wenn er in einer if-Anweisung verwendet wird. Es sei denn, ich übersehe hier etwas?

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

Vergleiche mit 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

In diesem Fall:

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

es wäre vielleicht klarer, wenn es so geschrieben wäre:

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

Die or Anweisung befindet sich im if-Body! Da boolesche Befehle Befehle sind, haben sie keine besondere Priorität.

Sie können begin/end als "Klammern" verwenden:

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

Ich denke also, es hat nichts mit Pfeifen zu tun, sondern mit Vorrang.

Wie Sie in diesem Fehler sehen können, gibt es viele Meinungen darüber, ob Fische boolesche Operatoren unterstützen sollten :)

Also, danke Jungs für die Energie, die hier reingesteckt wurde.

Meine Absicht ist es nicht, die Diskussion darüber zu führen, was besser ist oder nicht. Es ist nur eine praktische Sache.
Wie die meisten von Ihnen muss ich meine eigenen Skripte ausführen. Auch in ganz einfachen Dingen garantiert die &&-Bedingung den Befehlserfolg (Exit 0), während ";" Mach einfach weiter, ohne dich darum zu kümmern, was auch immer passiert ist. Richtig? Sie sind also überhaupt nicht gleich. Ich hoffe, da sind wir uns alle einig. :)

Ich habe also meine Skripte und keines davon funktioniert mit Fischen. Ja, ich benutze viel &&. Aber dies geschieht auch mit jedem Code über das Netz mit bash, im Allgemeinen auch mit &&. Um es kurz zu machen, ich kann meine Codes nicht mehr verwenden! :D

Ich habe mich gefragt ... Ist es möglich, eine Funktion oder Definition in der Fischkonfigurationsdatei zu erstellen, um NUR dieses Verhalten zu beheben (was nur && bedeutet) und es wie in der traditionellen Bash rückgängig zu machen? Ist es möglich? Plausibel? Machbar?

Auch hier stimme ich zu, dass die Verwendung von "und" schöner und klarer sein kann. Aber es funktioniert nicht mit meinem Code oder im Allgemeinen mit jedem Bash-Code, der über Anfänger hinausgeht. Anstatt also den bereits geschriebenen Code zu ändern und && zu ersetzen (... wird nicht passieren... und höchstwahrscheinlich nicht funktionieren), wäre es einfacher, den Fischen zu erlauben, die traditionelle Bash

Alles Gute Jungs und nochmals vielen Dank für die Mühe!!

Sind wir jemals der Kompatibilität mit bash / zsh Skripten näher gekommen? Ich habe fish gemäß meinen früheren Kommentaren aufgegeben, weil ich mir nicht die Zeit nehmen werde, die gesamte Infrastruktur zu konvertieren, die ich bereits in meinen Shell-Umgebungen auf so vielen Workstations und Servern aufgebaut habe. Würde es gerne noch einmal versuchen, wenn wir näher sind. Sonst bleibe ich einfach ohne weiter. Danke.

@rhoconlinux Wenn Sie Fish && werden Ihre Bash-Skripte nicht funktionieren. Da gibt es noch viel mehr Unterschiede.

Ich habe deine Antwort nicht verstanden ^_^
Ist es möglich einen Alias ​​oder eine Funktion für das && Problem zu definieren?

@rhoconlinux Nein, Sie && , würden Ihre Bash-Skripte aufgrund all der anderen Unterschiede zwischen Fish und Bash immer noch nicht ausgeführt werden.

@kballard autsch ! hmmm.... Ich bin so traurig, das zu hören. Ich hab es jetzt. Superklar. :)

Danke für das superschnelle Feedback. Ich werde Fisch für ein schöneres Alltagserlebnis verwenden und werde dann ein Bash-Terminal für meine Sachen behalten.

Beifall! :+1:

Wenn && ein Problem darstellt, ist es einfach, damit umzugehen.

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

Aber es ist unwahrscheinlich, dass dies das einzige ist, was Sie tun müssen. Was Sie meinen, ist eine Implementierung von #522.

Ich würde sagen, die Hauptmotivation für die &&-Kompatibilität besteht darin, vorhandene nicht zu konvertieren
Codebasen, sondern aus dem Internet kopieren und einfügen.
ZB sehe ich ein sudo add-apt-repo... && sudo apt-get update && sudo apt-get install ... Schnipsel, möchte es einfach kopieren und einfügen, aber es schlägt fehl.

Das können wir nie durch Bildung lösen – das wird es immer geben
Schnipsel einzufügen, und sie verwenden die Standard-[ba]sh-Syntax.
Und && ist bei weitem das Problem Nr. 1, auf das ich stoße.
( export FOO=bar ist #2, kann aber mit function export; set -x -g (echo $argv | sed 's/=/\n/'); end gelöst werden.)

Es ist jedoch kein tiefgreifendes Problem: Ich habe mir das Tippen angewöhnt
bash , Einfügen, Strg+D.
Hmm, ich bin versucht, eine Tastenkombination hinzuzufügen, um die aktuelle/vorherige Funktion auszuführen
Kommandozeile unter bash.

Meine zwei Cent zu diesem Thema:
Ich arbeite an einem Bereitstellungstool (https://github.com/andres-montanez/Magallanes), das Shell-Befehlsaufrufe durchführt, und die Mehrheit der Benutzer und Mitwirkenden wird eine Bash-Shell verwenden. Natürlich werden hier und da '&&' verwendet, um Befehle aneinanderzureihen.

Es gibt offensichtliche Problemumgehungen (wie das explizite Übergeben aller Befehle an die Bash)
Aber das bringt eine Reihe von Schmerzpunkten mit sich. Zum einen kann es seltsame Nebenwirkungen geben (dh der PATH und andere Variablen sind nicht auf die gleiche Weise definiert), es bedeutet, dass einige Kernteile des Tools nur zu diesem Zweck gehackt werden, und ich muss meine Fixes von Version zu Version zusammenführen jedes Mal wenn ich aktualisiere.

&& ist nur eine von vielen Bash-Funktionen, mit denen fish nicht kompatibel ist, aber es könnte die einfachste und am häufigsten verwendete sein. Das obige Tool ist beispielsweise in PHP, sodass alles, was sehr komplex ist, in PHP ausgeführt wird und nur grundlegende Systembefehle an die Shell übergeben werden. Es ist frustrierend, bei einem so minimalen Anwendungsfall auf Syntaxinkompatibilitäten zu stoßen.

Ich stimme völlig mit dem, was @cben sagte && ist ein spezieller Fall meiner Meinung nach, weil es Online Hunderte von Code - Schnipseln sind , wo der einzige Unterschied zwischen Kopieren und Einfügen oder nicht die Unterstützung für ist && .
Obwohl ich zustimme, ist es wichtig zu berücksichtigen, wie sich Fish in Bezug auf die Syntax usw. entwickelt. Ich denke, dass dies das Leben vieler Entwickler, die Fish verwenden oder verwenden möchten, viel einfacher machen würde. Ich weiß, es scheint nur ein einfaches Ersetzen von && durch ; and aber es ist immer nervig und macht es ein bisschen unangenehm, wenn ich anderen erzähle, wie toll Fisch ist, aber dann muss ich herumfummeln und einige Keywords ändern, fragen sie sich meistens, warum ich so eine einfache Sache ändern muss. Dann muss ich Fische verteidigen, und das ist kein guter Grund, Fische zu fördern.
Manchmal sind es wirklich die einfachsten Dinge, die die größte Wirkung haben.
Kurz gesagt, ich bin dafür, die bash-Syntax && zuzulassen.

Ich stimme dem zu, was @Globegitter und @cben gesagt haben. Eine große Anzahl von Skripten und Programmen hängt von && und || . Ich verwende Fischshell auf meiner Workstation und es wäre schön, wenn ich beim Schreiben von Skripten Shell-übergreifende Kompatibilität hätte.

Angesichts der Tatsache, dass es viele signifikante Unterschiede zwischen Fish- und Bash-Skripten gibt, die über nur && und || hinausgehen, warum glauben Sie alle, die hier kommentieren, dass Fish && akzeptieren würde? irgendwie sinnvoll sein? Wenn Sie einen Ausschnitt des Bash-Codes ausführen müssen, führen Sie einfach bash , führen Sie den Ausschnitt aus und verlassen Sie dann wieder Fish.

Ich denke, viele Leute würden gerne auf Fisch "umsteigen", haben aber eine Infrastruktur, die sie mitbringen müssen. Ich zum Beispiel habe 15 Jahre Shell-Skripte nur auf meiner Workstation (ganz zu schweigen von anderen Servern, auf denen ich auch fish ausführen möchte), für die ich nicht die Zeit mit der Konvertierung verbringen möchte. Es macht mir nichts aus, im Laufe mehrerer Monate herumzustöbern und die Dinge "auf die Art" zum Laufen zu bringen, aber es gibt keine Möglichkeit, diese Art von Anfangsinvestition in meinen Workflow für den Wechsel zu einer anderen Shell zu tätigen.

Ich glaube, dass Fische einen erheblichen Zustrom von Benutzern haben würden, wenn das allgemeine Kompatibilitätsproblem angegangen würde, aber nach den Aussagen anderer, die in der Entwicklung von Fischen arbeiten, scheint dies keine Priorität für das Projekt zu haben. Genau aus diesem Grund behalte ich dies im Auge, da ich irgendwann zum Fischen wechseln möchte, wenn sich die Landschaft diesbezüglich ändert.

In Bezug darauf, nur bash oder zsh auszuführen, wäre dies in meinem Fall eine erhebliche Menge an Ausführen dieser Shells, und es ist einfach albern, diesen Weg sonst zu gehen.

@kballard Ich habe einen idealen Workflow für 95% der bash oder was auch immer, sonst nichts. Meistens ist das einzige, was diese Skripte daran hindert, mit genau diesem Workflow zu arbeiten, dass && vorhanden ist. Das ist der Grund, warum für mich und ich gehe davon aus, dass die Lösung dieses Problems für die meisten anderen hier sehr nützlich wäre.
Wenn Sie das nicht selbst erleben, glauben Sie mir, es summiert sich und bleibt Ihnen wirklich in Erinnerung, wenn Ihr Workflow so oft unterbrochen wird.

Ich liebe Fisch für alles andere und deshalb konnte ich nicht zurückschalten, aber gerade diese einfache Sache verhindert, dass es für mich großartig ist und ich vermute einige der anderen hier.

Bitte schön. Sobald PR #1633 landet, können Sie Folgendes nehmen und in ~/.config/fish/functions/fish_user_key_bindings.fish speichern:

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

Dies bindet & und | und macht es so, dass die Eingabe von && oder || automatisch in die entsprechenden ; and / ; or translate übersetzt command one && command two einfügen können und es funktioniert.

Beachten Sie, dass dieses Skript bis zur Annahme && PR #1633 funktioniert für _typing_ || , aber nicht zum Einfügen.

@kballard Wow, das sind tolle Neuigkeiten! Ich danke dir sehr.

Sieht so aus, als würde dies den Suchmodus nicht richtig handhaben (nicht sicher über den Pager-Modus; ich bin mir nicht sicher, was das genau umfasst). Durch Drücken von & oder | während der Suche wird die Suche beendet. Das heißt, ich weiß nicht, wie ich damit umgehen soll.

Ich habe das Skript mit einem Bugfix für die Eingabe von | oder & in einem mehrzeiligen Befehl aktualisiert.

@kballard Ich habe gesehen, dass die PR gelandet ist. Das oben eingefügte Skript sollte also dafür sorgen, dass && mit dem neuesten Master funktioniert?

Ja sollte es. Probieren Sie es aus und lassen Sie es mich wissen, wenn Sie Probleme haben.

-Kevin

Am 1. September 2014 um 01:14 Uhr schrieb Markus Padourek [email protected] :

@kballard Ich habe gesehen, dass die PR gelandet ist. Das oben eingefügte Skript sollte also dazu führen, dass && mit dem neuesten Master funktioniert?


Antworten Sie direkt auf diese E-Mail oder zeigen Sie sie auf GitHub an.

Ich habe dieses Skript mit der neuen Version 2.1.1 ausprobiert, die vor ein paar Tagen veröffentlicht wurde, und es scheint nicht zu funktionieren. Muss ich bis 2.2 warten? Danke!

@pragmattica : 2.1.1 war eine Sicherheits-Bugfix-Version. Es wurden keine neuen Funktionen hinzugefügt.

@xfix : Okay. Danke für die Information. Kann es kaum erwarten bis 2.2!

FANTASTISCH :+1:

Irgendein laufendes Changelog verfügbar? Es scheint, dass die Wurzel CHANGELOG ziemlich veraltet ist.

@pragmattica Jetzt, da Fish 2.2 draußen ist, habe ich das unter Ubuntu 14.04 ausprobiert und echo 'test1' && echo 'test2'; wird zu echo test1 &; and echo 'test2';

Könnte es irgendwo ein Problem innerhalb der fish_user_key_bindings.fish ? (Ich werde versuchen, es selbst zu überprüfen, aber mein Wissen über Fish / Bash-Skripte ist etwas wackelig)

Bearbeiten: Es scheint jedoch zu funktionieren, wenn Sie einen Befehl mit && . Es wäre vielleicht ein bisschen schön, wenn es danach auf dem Platz passieren würde, aber das ist nicht wirklich wichtig. Toll, dass die Hälfte funktioniert :)

-1 zu seltsamen Symbolen:

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

+1 zu einfachen Symbolen:

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

Aaahhh Ich glaube ich weiß woran es liegt @pragmattica der Befehl commandline gibt den Puffer ohne Anführungszeichen zurück. Ja das scheint es zu sein. Sobald https://github.com/fish-shell/fish-shell/issues/2210 behoben ist, sollte auch das obige Skript behoben werden.

Wird dieser Anfang noch in Betracht gezogen?

+1
Die Symbole sind nicht seltsam, sie werden in einer Vielzahl von Programmiersprachen häufig für die Logik verwendet.
Die Kompatibilität mit Kopieren und Einfügen ist ein sehr reales Argument, das ich unterstütze.

Ich werde der Bösewicht sein und diese Diskussion beenden. Dies wird nicht umgesetzt. Besonders stören mich die wiederholten Äußerungen, "Befehle aus Bash-Skripten ausschneiden und einfügen" zu wollen. Selbst wenn fish die Operatoren && und || , würde dies nicht sicherstellen, dass Sie Anweisungen mit diesen Operatoren einfach ausschneiden und einfügen können. Wir möchten nicht den Eindruck erwecken, dass Sie dies tun können. Ehrlich gesagt, wenn Sie bash/zsh-Syntax und -Verhalten wünschen, sollten Sie diese Shells verwenden (oder eine Alternative, die behauptet, mit ihnen kompatibel zu sein).

Die meisten der anderen diskutierten Ideen sollten ihre eigenen Probleme haben. Insbesondere kann es von Vorteil sein, einige der [[ ... ]] Verhaltensweisen zu implementieren, die zuerst von ksh88 (nicht bash) eingeführt wurden. Aber wahrscheinlich durch die Verbesserung des eingebauten test Befehls oder einen neuen Befehl, anstatt diese speziellen Token zu implementieren.

Ich bin immer noch sehr beunruhigt über diese Vorstellung, zsh und bash nicht zu unterstützen. Ich kann die Logik verstehen, aber ich stimme ihr nicht zu. Ich habe mich vor einiger Zeit sehr für Fisch interessiert, bin aber aufgrund dieses Widerstands wieder weggezogen. Es könnte eine Gelegenheit geben, das Projekt hier abzuzweigen, wenn es genug von uns als Entwickler gibt, die dies gerne implementiert sehen würden. Es ist traurig, diesen anhaltenden Widerstand zu sehen, der letztendlich den Vorwärtsdrang und die Akzeptanz eines so interessanten Werks behindert.

@ylluminate was meinst du mit "unterstützen von zsh und bash?" Welchen Grad an Kompatibilität möchten Sie sehen?

Ich bin immer noch sehr beunruhigt über diese Vorstellung, zsh und bash nicht zu unterstützen. Ich kann die Logik verstehen...

Ich fürchte, ich verstehe Ihre Logik nicht, wenn Sie die Bash- und Zsh-Funktionen von Fisch unterstützen. Wenn Sie Java wollen, warum sollten Sie C++ verwenden? Wenn Sie Perl wollen, warum sollten Sie Python verwenden? Wie @ridiculousfish gerade gefragt hat, was müssten Fische außer etwas syntaktischem Zucker noch unterstützen, um dich glücklich zu machen? An welchem ​​Punkt wird Fisch einfach zu einem weiteren Bash-Klon?

PS, ich programmiere seit 1979 für meinen Lebensunterhalt und benutze UNIX seit Mitte der 80er Jahre. Ich habe so viele Shells benutzt, dass ich nicht mehr zählen kann (zB Bourne, Csh, Ksh88, Ksh93, Bash, Zsh, Xonsh). Das Wechseln der Shells erfordert immer Arbeit (deshalb mache ich es nicht öfter als alle fünf Jahre oder so). Wenn ich dies tue, beschwere ich mich nicht, dass meine neue Shell nicht alle meine Legacy-Skripte ohne Änderung ausführt.

@krader1961 Schöne Rede. Meiner bescheidenen Meinung nach ...

Ich würde nicht die ganze Zeit Skripte in Fisch machen, da (gefolgt von Befehlen):

  1. Das Skript von fish ist langsam (langsamer als mksh)
  2. eine seltsame Syntax (zB ; and , ; or die für mich hässlich aussieht)
  3. nicht posix-kompatibel (ich kann sagen, die Syntax ist einfach, braucht aber noch Zeit zum Lernen)

Nun, die 2 und 3 würden mich nur interessieren, wenn das Fischskript schneller ist als andere Shells (zB mksh, bash).

Andererseits verwende ich Fisch, weil:

  1. Startzeit ist schneller als zsh (aber langsamer als bash)
  2. haben viele Funktionen standardmäßig aktiviert (Syntaxhervorhebung ist die beste)
  3. Konfigurationen ist schön und einfach (insbesondere set -Ux )

@ylluminate Wenn ich mir diese vier Jahre alte Ausgabe

Wenn Sie wirklich überlegen, wie Sie && || auf Fisch implementieren und das nicht sehr unfischig machen, dann sehen Sie vielleicht, dass Sie nur begin; end ausstoßen (sehen Sie, was Commit 594b460ba2d8dca59a3bfd282397c5f33aa9da6f bewirkt,Zähler- ; and or spielen Doppelrollen,sehr etwas hässlich) und bekommen nur etwas Zucker.

@pickfire Können Sie Fishs Skript ist langsam"

FWIW in meinen Tests ist fish insgesamt schneller als bash, dank posix_spawn und seinem schnellen Parser, obwohl es in bestimmten Fällen wie alias langsamer sein kann.

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 Stellen Sie sich vor, es ist im Vergleich zu den anderen für nur ein einziges echo bereits sehr langsam.

@krader1961 @ridiculousfish IMO, sobald https://github.com/fish-shell/fish-shell/issues/2210 freigegeben wird, kann dies geschlossen werden. Es gibt eine sehr einfache Lösung, die @kballard gepostet hat.

@pickfire Danke, dass echo . Die Startzeit ist sehr wichtig, aber Sie können aus diesem Test keine Schlussfolgerungen über die Startzeit (die hauptsächlich von config.fish abhängt) ziehen.

Hier ist ein anderer Mikro-Benchmark:

> 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

hier gewinnt fish mit großem Abstand, aber dies misst hauptsächlich den Unterschied von fork vs posix_spawn.

Ich denke, eine Schlussfolgerung hier ist, dass wir eine umfassende Benchmark-Suite brauchen.

@ridiculousfish Hier ist der Benchmark, den Sie mir gegeben haben:

> 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

Das mksh scheint eine beeindruckende Geschwindigkeit zu haben.

ls @pickfire fish ist eine Funktion unter Linux, die einige andere command ls . (Auf Darwin ist das ls Wrapper von Fisch viel dünner - ich hätte darauf hinweisen sollen, aber ich habe es vergessen.)

Die Erklärung für die "beeindruckende Geschwindigkeit" von mksh in Ihrem Test ist, dass mksh keine Klammererweiterung hat, also ls nur einmal aufruft. Offensichtlich ist es viel schneller, ls einmal aufzurufen, als es 1000-mal aufzurufen.

Dies zeigt, dass die Leistungsmessung sehr knifflig ist – es ist sehr einfach, etwas anderes zu messen, als Sie glauben zu messen!

@ridiculousfish , gibt es einen Grund, die Funktion ls zu verwenden, ist das Fischskript im Vergleich zu command ls ? Die Ausgabe ist während der Skripterstellung nicht wichtig.

Okay, dieses Mal habe ich getan, was du gesagt hast:

> 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

Am Ende ist mksh immer noch am schnellsten, jetzt finde ich es beeindruckend, dass fish schneller ist als mksh . Wenn fish eine integrierte Unterstützung für die parallele Befehlsausführung hätte, wäre dies meiner Meinung nach die schnellste von allen gewesen.

Diese 0,66-Benutzerzeit ist ziemlich hoch. Ich vermute, dass es an Ihren config.fish-Inhalten liegt - die Aliase definieren und so. Fürs Protokoll, das sehe ich auf meiner Linux-Box (jeweils das Beste von 3):

> 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...

alle sind sich sehr nah.

Es könnte für jeden Benchmark interessant sein, eine Art "Oracular Shell" zu integrieren, die einfach eine fork/exec oder posix_spawn auf einen Pfadbefehl ausführt, damit wir ein Gefühl dafür bekommen, wie weit wir von der maximalen Geschwindigkeit entfernt sind, die das Betriebssystem liefern kann .

@ridiculousfish , meine config.fish ist sehr kurz:

# 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

Nun, weil es wahrscheinlich fisherman , nicht sicher, ob es verlangsamt wird. @bucaran ist der nette Kerl dafür. Dieses Mal habe ich die config.fish geleert (bestes Ergebnis von 5 Wiederholungen):

> 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 Können Sie in einem anderen Problem chatten, damit ich Ihre Nachrichten blockieren kann?

Ja, tut mir leid, dass ich dieses Problem spamme. @pickfire Wenn Sie einige Benchmarks verfolgen

Was die Bash- und Zsh-Kompatibilität angeht, erwarte ich persönlich keine vollständige Kompatibilität, aber mit jedem bisschen Kompatibilität können Fische populärer werden.
Auch ohne Berücksichtigung von Skripten sind && und || wichtig, da sie sehr häufig zum Verketten von Befehlen verwendet werden. Als Beispiel habe ich immer noch Probleme mit #2292. Ich weiß, dass es nicht als Fischwanze angesehen werden kann, aber Tatsache ist, dass eine Verbesserung der Fischkompatibilität es beheben würde.

Ich bin hier bei maxfl, :-1: weil ich || und && als Teil der Fischsyntax habe, wenn dies eine Volksabstimmung sein soll.

Fisch ist nicht bash (oder zsh). Es gibt keinen zwingenden Grund, && und || zu implementieren, außer der Kompatibilität mit diesen Shells. Die Vereinbarkeit mit dem Status Quo ist ein Anti-Ziel dieses Projekts.

@Nodd : Ihr Hinweis auf Ausgabe #2292 ist eigentlich ein Beispiel dafür, warum Fish diese Syntax nicht implementieren sollte. Dies wäre ein weiterer Schritt, um die Leute glauben zu lassen, dass fish ein POSIX-Klon (bash, zsh usw.) ist. Das würde nur andere Anforderungen stellen, dass sich Fische in anderen Gebieten wie diese Muscheln verhalten.

Für alle Leute, die nach einer Lösung suchen, kann ich seit Fisch 2.3 bestätigen, dass es endlich eine voll funktionsfähige Lösung gibt.

Tun Sie einfach, was in der obigen Antwort erwähnt wird:

Bitte schön. Sobald PR #1633 landet, können Sie Folgendes nehmen und in ~/.config/fish/functions/fish_user_key_bindings.fish speichern:

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

Was ist mit nur?

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

@brj Setzen Sie das auch in ~/.config/fish/functions/fish_user_key_bindings.fish ? Das schien mir nicht zu helfen.

Sie müssen diese Funktion als Quelle verwenden. Ihre Optionen sind also, es in Ihre config.fish oder in ~/.conf.d/[name-dont-matter].fish einzufügen.

@brj : Falsches Problem für diese Funktion. Hier geht es um "&&" und "||", nicht um "!!!" - verschiedene Dinge.

@faho lol, du hast recht. Ich bekomme immer eine Benachrichtigung von diesem Problem, also dachte ich, dies sei ein weiterer Fall von Sudo !!.

@Globegitter Sorry für die Verwirrung!

Wie wäre es, den vorgeschlagenen Workaround mit Fisch als Beispiel zu versenden, damit Benutzer ihn bequem kopieren können? Die Fehlermeldung könnte leicht erweitert werden, um dies zu erwähnen. Ich füge weiterhin denselben Liner (von Gerrit Code-Review) ein, in dem && verwendet wird, weil es in so ziemlich allen Shells funktioniert (einschließlich Windows cmd.exe außer Unix-y-Shells). Für mich ist das oben erwähnte Skript ein Produktivitätsverstärker (ich habe eine Weile bash -c "hier einfügen" eingegeben...).

Wie mache ich && ? Gibt es eine Auflösung?

Gleiches Problem wie oben, ich kann wirklich keine Möglichkeit finden, es zu tun

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

bei Fischen.

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

@ivan hat das versucht, aber es gibt "and" und "./a.out" als Argumente für gcc.

//edit: Übrigens habe ich das Bash-Skript verwendet, weil dies in fish völlig unmöglich zu sein scheint :(

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

Ich mache diese "völlig unmögliche" Sache ziemlich oft. Vielleicht versuchen Sie die Syntax ; and in einer sauberen Fischumgebung? Wenn es nicht funktioniert, stimmt vielleicht etwas mit Ihren Semikolons? Geben Sie dies in fish ein oder wird es von einem anderen Programm übergeben?

@ivan Eingeben .

Sorry für die wahrscheinlich dumme Frage, aber wie mache ich Klammern? Ich kann in der Dokumentation kein Wort darüber finden und es ist nicht gerade ein googlebares Thema:(

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

@kozec Ich glaube, du hast nur Probleme, deine Artikel hier zusammenzufassen. Was Sie verwenden müssen, ist begin wie eine linke Klammer (so stelle ich mir das vor) und end wie eine rechte.

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

oder eingerückt:

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

@floam Danke, das funktioniert fast. Aber Sachen vor & werden nicht in den Hintergrund geschickt :(

Minimalbeispiel:

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

schläft 2s, startet dann xterm, _dann_ startet XServer für diesen xterm. xterm ofc stürzt ab, bevor XServer bereit ist.

Sie werden feststellen, dass Sie es umgehen können, indem Sie es dort tun, wo Sie müssen, nicht schön:

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

Wenn Sie eine große Anzahl vorhandener Skripte für die Entwicklung, das Erstellen und innerhalb von npm-Laufskripten haben, ist es nicht sinnvoll, zu wechseln, zumal einige / die meisten nicht auf fish sind. Für die regulären Bash-Skripte mit Shebang und allem ist das natürlich kein Problem.

Das Schöne (oder "Nette") an && ist, dass es auf den regulären Shells nicht nur auf Linux und Macs, sondern auch auf Windows funktioniert, was für die schnelle Einrichtung von Entwicklungsumgebungen usw.

Auf keinen Fall ein Dealbreaker, aber irgendwie schwer zu verstehen, warum es auch so sein sollte, es hinzuzufügen?

Nun, das ist ein ziemlich dummes Argument. Warum nicht verschiedene "Modi" für den Fisch-Compiler haben? Dh, eine Art von Einstellung, die Sie aktivieren können, bei der Sie "reines" Fischmaterial oder Kompatibilität mit bash-ähnlichen Muscheln zusammen mit Fischismen haben können. Sie könnten sogar unterschiedliche "Kompatibilitätsstufen" für andere Shells haben, so dass Sie volle Kompatibilität, keine Kompatibilität oder etwas dazwischen haben. Ich meine, auf einer grundlegenden Ebene könnten Sie dafür zumindest eine Art Source-to-Source-Compiler implementieren. Oder nehmen Sie Bash-Code und übersetzen Sie ihn in eine interne Zwischenrepräsentation für Fische. Sie könnten in dieser Hinsicht alle möglichen Dinge für die Übersetzung tun. Korrigieren Sie mich, wenn ich falsch liege, aber ich glaube, dass die sprachlichen Konzepte von bash et al. vs. Fische sind nicht weltbewegend, oder?

Wie auch immer, das sind meine 0,02 $ zu diesem Thema, das wirklich albern erscheint, weil es auf der Prämisse basiert:

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

wenn es nichts gibt, was einen Mittelweg zwischen diesen beiden Begriffen verhindert.

Man sollte sich zumindest der Realität stellen, dass Bash-ähnliche Muscheln weitaus mehr Standard und beliebter sind als esoterische Muscheln wie Fische, daher sollte es wirklich eine Art Kompatibilitätsschicht geben, um eine realistische Chance zu haben, dass Fische eine Muschel werden, die in der Lage ist, die Zehen zu halten -toe with bash in Bezug darauf, dass sie weit verbreitet ist und keine Kompatibilitäts-Kopfschmerzen verursacht.

... wenn nichts dagegen spricht, Mittelwege zwischen diesen beiden Begriffen zu haben.

Nichts anderes als jemand (oder eine Gruppe von Personen), der mehr als 2.000 Stunden (ein Personenjahr) investiert, um den erforderlichen Code zu schreiben. Ich freue mich darauf, Pull-Anfragen von Ihnen @ylluminarious zu

Implementiert in #4620.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen