Komentarze w tekście dotyczące Bash?


142

Chciałbym móc skomentować pojedynczą flagę w jednowierszowym poleceniu. Bash tylko wydaje się miećfrom # till end-of-line komentarze. Patrzę na takie sztuczki jak:

ls -l $([ ] && -F is turned off) -a /etc

To brzydkie, ale lepsze niż nic. Czy jest lepszy sposób?

Poniższe wydaje się działać, ale nie jestem pewien, czy jest przenośny:

ls -l `# -F is turned off` -a /etc

Ta #commentsztuczka jest również wymieniona tutaj: stackoverflow.com/questions/9522631/…
Juha Palomäki

1
Po linku, o którym wspomniał @Juha Palomäki, ${IFS#comment}w komentarzach znajduje się ta cudowna sztuczka, którą @pjh wprowadził. Żadna powłoka podrzędna nie jest wywoływana.
Alexis

Odpowiedzi:


110

Mój preferowany to:

Komentowanie w skrypcie Bash

Będzie to miało trochę narzutów, ale technicznie jest odpowiedzią na twoje pytanie

echo abc `#put your comment here` \
     def `#another chance for a comment` \
     xyz etc

W szczególności w przypadku rurociągów istnieje czystsze rozwiązanie bez kosztów ogólnych

echo abc |        # normal comment OK here
     tr a-z A-Z | # another normal comment OK here
     sort |       # the pipelines are automatically continued
     uniq         # final comment

Jak umieścić komentarz do wiersza dla polecenia wielowierszowego


3
Zauważ, że musisz używać lewych apostrofów, $(#comment)nie działa.
funroll

1
Niektóre wersje będą traktować )jako część samego komentarza. Większość wyzwań związanych z bash wynika z kompatybilności retro ze starszymi wersjami, a jedną z powszechnych strategii jest użycie najstarszego możliwego rozwiązania.
Rafareino

2
Uwaga, to nie jest prawdziwy komentarz: true && `# comment` && trueto prawidłowe wyrażenie. Prawdziwy komentarz wygenerowałby coś takiego: syntax error near unexpected token && '' '
Sebastian Wagner

Masz rację @sebastianwagner, pamiętaj również, że zawiodłoby to w zwarciu OR lub czymś w tym rodzaju, ale myślę, że jest tak dobre, jak możemy to uzyskać bez zbytniego komplikowania rzeczy. Dla mnie to znak, że potrzebny jest lepszy język, ale da się świetnie, utrzymując już zbudowany kod z takimi „komentarzami”, aby go udokumentować.
Rafareino,

Dzięki, że mi pomogło!
xiarnousx

58

Uważam, że najłatwiej (i najbardziej czytelnie) jest po prostu skopiowanie wiersza i skomentowanie oryginalnej wersji:

#Old version of ls:
#ls -l $([ ] && -F is turned off) -a /etc
ls -l -a /etc

Głosuj za jasnością. Nie wiem, dlaczego nie jest to pierwsza opcja.
David Tabernero M.,

ale czy to nie jest wbudowane? przypuszczam, że można uczciwie powiedzieć, że potrzeba robienia rzeczy, które nie są obsługiwane przez bash, jest przyczyną znalezienia innego sposobu
ThorSummoner

25

$(: ...) jest trochę mniej brzydki, ale nadal nie jest dobry.


2
Dzięki tej składni odpalasz powłokę podrzędną, komentarz ma na celu poprawę redability bez zmiany zachowania kodu w ogóle, ale czas na uruchomienie / zakończenie tej powłoki podrzędnej sprawi, że kod będzie wolniejszy (co najmniej), dlaczego nie użyć tylko dwukropka na początku nowej linii?
Rafareino

1
Z $ {IFS # ...} żadna powłoka podrzędna nie jest wywoływana.
Alexis

3
@Rafareino: tak. Ale poważnie, w 95% aplikacji ten koszt nie ma żadnego znaczenia. W wielu przypadkach, w których ma to znaczenie, prawdopodobnie dobrym pomysłem byłoby użycie szybszego języka niż Bash.
lewej około

... kłopot w tym, że $(: ...)składnia w rzeczywistości wydaje się nie zezwalać na osadzanie komentarzy: podczas gdy echo "foo" `# comment` "bar"zakończy komentarz po drugim odwrotnym znaku, rzekomy odpowiednik echo "foo" $(: # comment) "bar"nie analizuje niczego za #.
lewej około


4

Oto moje rozwiązanie dla komentarzy w tekście między wieloma poleceniami potokowymi.

Przykładowy kod bez komentarzy:

    #!/bin/sh
    cat input.txt \
    | grep something \
    | sort -r

Rozwiązanie dla komentarza potoku (przy użyciu funkcji pomocniczej):

    #!/bin/sh
    pipe_comment() {
        cat - 
    }
    cat input.txt \
    | pipe_comment "filter down to lines that contain the word: something" \
    | grep something \
    | pipe_comment "reverse sort what is left" \
    | sort -r

Lub jeśli wolisz, oto to samo rozwiązanie bez funkcji pomocniczej, ale jest trochę bardziej bałaganiarskie:

    #!/bin/sh
    cat input.txt \
    | cat - `: filter down to lines that contain the word: something` \
    | grep something \
    | cat - `: reverse sort what is left` \
    | sort -r

7
Na marginesie, jeśli przesuniesz pionową kreskę na koniec poprzedniej linii, możesz pozbyć się obrzydliwego odwrotnego ukośnika-nowej linii.
tripleee

3

Większość poleceń pozwala argumentom pojawiać się w dowolnej kolejności. Po prostu przenieś skomentowane flagi na koniec linii:

ls -l -a /etc # -F is turned off

Następnie, aby go ponownie włączyć, po prostu odkomentuj i usuń tekst:

ls -l -a /etc -F

1
cholera, dodałem #bez ani jednej spacji po poleceniu. Dziękuję Ci!
asgs


1

Aby wyłączyć część polecenia, taką jak a && b, po prostu utworzyłem pusty skrypt, xktóry jest na ścieżce, więc mogę robić takie rzeczy, jak:

mvn install && runProject

kiedy muszę budować, i

x mvn install && runProject

kiedy nie (używając Ctrl + Ai, Ctrl + Eaby przejść do początku i końca).

Jak zauważono w komentarzach, innym sposobem na to jest wbudowany Bash :zamiast x:

$  : Hello world, how are you? && echo "Fine."
Fine.

2
Taki wbudowany już istnieje: :Jak w:string; of; commands; : disabled; enabled;
xenithorb

Jeszcze lepiej :) Dzięki
Ondra Žižka

-1

Jeśli komentarz jest wart dodania, prawdopodobnie może pojawić się na końcu wiersza lub w osobnym wierszu. Rzadko kiedy potrzebuję komentarzy w linii z kodem przed i po komentarzu w jakimkolwiek języku.

Och, jest jeden wyjątek, którym jest dialekt języka SQL, którego zwykle używam i który używa '{comments}'. Sporadycznie napiszę:

CREATE UNIQUE INDEX u1_table ON Table(...);
CREATE {DUPS} INDEX d1_table ON Table(...);

Ale nawet to jest naciągane.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.