Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

[Bash] Unterschied VARIABLE=`Befehl`und VARIABLE=$(Befehl)

2 views
Skip to first unread message

Marco Moock

unread,
Aug 25, 2022, 7:03:40 AM8/25/22
to
Hallo zusammen,

was ist da der Unterschied, so es einen gibt?
Auf die Schnelle konnte ich keinen erkennen.
Beide speichern die Standardausgabe des Befehls in einer Variable.

m@ryz:~$ OS=$(uname)
m@ryz:~$ echo $OS
Linux
m@ryz:~$ OS=`uname`
m@ryz:~$ echo $OS
Linux
m@ryz:~$

--
Gruß
Marco

Marcel Logen

unread,
Aug 25, 2022, 7:16:40 AM8/25/22
to
Marco Moock in de.comp.os.unix.shell:

[$(...) vs. `...`]
>was ist da der Unterschied, so es einen gibt?
>Auf die Schnelle konnte ich keinen erkennen.

Siehe
<https://manpages.debian.org/bullseye/bash/bash.1.en.html#Command_Substitution>.

Marcel cgps (410428)
--
╭────────────╮ ╭────╮ ╭─────────────────────╮
╭────╯ ╭─────╯ ╭─╮ ╭─╯ ╰─╮ ╰─────────────╮ │
───╯ ╭──╯ ╭──╮ ╭────╮ │ │ ╰─╮ ╭───╯ ╭──╮ ╭─╮ ╭─────╯ ╭──╯
╰─────╯ ╰──╯ ╰─╯ ╰────╯ ╰─────╯ ╰─╯ ╰─╯ c26dc9 ╰────

Michael Schütz

unread,
Aug 25, 2022, 7:44:04 AM8/25/22
to
Marco Moock <mo...@posteo.de> schrieb:
> Hallo zusammen,
>
> was ist da der Unterschied, so es einen gibt?
> Auf die Schnelle konnte ich keinen erkennen.
> Beide speichern die Standardausgabe des Befehls in einer Variable.
>
> m@ryz:~$ OS=$(uname)
> m@ryz:~$ OS=`uname`
>
Wenn ich es mir richtig gemerkt habe ist `` die alte, in jeder Shell
funktionierende Methode und $() nur bei 'bash' und 'ksh'.

Schultze

--
Menschen, die sich auf ihren Lorbeeren ausruhen, tragen sie am falschen
Ende.
Malcolm Kushner

Marco Moock

unread,
Aug 25, 2022, 7:57:53 AM8/25/22
to
Am Donnerstag, 25. August 2022, um 13:16:17 Uhr schrieb Marcel Logen:

> Siehe
> <https://manpages.debian.org/bullseye/bash/bash.1.en.html#Command_Substitution>.

ok

| When the old-style backquote form of substitution is used, backslash
| retains its literal meaning except when followed by $, `, or \. The
| first backquote not preceded by a backslash terminates the command
| substitution. When using the $(command) form, all characters between
| the parentheses make up the command; none are treated specially

Aber bei den Klammern ist das natürlich nicht der Fall, muss man mit \
escapen. Das ist ebenso bei Nutzung der Backticks der Fall.

ok=`echo \(\)`

Backticks müssen bei der neuen Variante auch escaped werden.

ok=$(echo \`)

m@ryz:~$ ok=`echo \``
bash: command substitution: Zeile 1: Dateiende beim Suchen nach »`«
erreicht.
bash: command substitution: Zeile 2: Syntaxfehler: Unerwartetes
Dateiende.

geht aber nicht. Das wäre also ein Unterschied.

Michael Schütz

unread,
Aug 25, 2022, 8:17:04 AM8/25/22
to
Michael Schütz <der.sc...@web.de> schrieb:

> Wenn ich es mir richtig gemerkt habe ist `` die alte, in jeder Shell
> funktionierende Methode und $() nur bei 'bash' und 'ksh'.
>
Hier steht es geschrieben:
https://openbook.rheinwerk-verlag.de/shell_programmierung/shell_004_003.htm#t2t32

Schultze

--
Wer einen Eindruck von einer zivilisierten Kultur bekommen will, blicke
nach Schottland.
Voltaire

Ulf Volmer

unread,
Aug 25, 2022, 12:37:03 PM8/25/22
to
On 25.08.22 13:03, Marco Moock wrote:
> Hallo zusammen,
>
> was ist da der Unterschied, so es einen gibt?
> Auf die Schnelle konnte ich keinen erkennen.
> Beide speichern die Standardausgabe des Befehls in einer Variable.

Der vermutlich relevanteste: $() läßt sich verschachteln:

echo $(echo $(echo ulf))
ulf

Viele Grüße
Ulf

Andreas Fenner

unread,
Aug 25, 2022, 1:52:24 PM8/25/22
to
Am 25.08.2022 um 18:37 schrieb Ulf Volmer:
> echo $(echo $(echo ulf))

Backticks lassen sich auch schachteln - ist nur etwas mühsamer:


af@pi3:~ $ echo $(echo a $(echo b))
a b
af@pi3:~ $ echo `echo a \`echo b\``
a b
af@pi3:~ $



Marcel Logen

unread,
Aug 25, 2022, 4:36:49 PM8/25/22
to
Marco Moock in de.comp.os.unix.shell:

>m@ryz:~$ ok=`echo \``
>bash: command substitution: Zeile 1: Dateiende beim Suchen nach »`«
>erreicht.
>bash: command substitution: Zeile 2: Syntaxfehler: Unerwartetes
>Dateiende.

Mit dem "\´" fängt eine zweite Substitution innerhalb der ersten
an, siehe Posting von Andreas.

Auf diesem Rechner hier habe ich keine bash, deshalb mit ksh:

| t20$ echo "$KSH_VERSION"
| @(#)PD KSH v5.2.14 99/07/13.2

| t20$ ok=`echo \``
| ksh: no closing quote

| t20$ ok=`echo \\\``

| t20$ echo "$ok".
| `.
| t20$

:-)

Marcel clig (415312)
--
╭─╮ ╭─╮ ╭────╮ ╭──╮ ╭────╮ ╭───────
╭───╯ ╰─╮ ╭─╯ ╰──╯ ╭─╯ │ │ ╭────╯ ╭─╯ │
╰──╮ ╭─╯ ╭──╮ ╭──╯ │ ╭──╮ ╭─╯ ╰────╯ ╭──╯ ╭─╯
╭───╯ ╰─────╯ ╰───╯ ╰───╯ ╰─╯ ╰────╯ 682cdc

Marcel Logen

unread,
Aug 25, 2022, 4:37:52 PM8/25/22
to
Marco Moock in de.comp.os.unix.shell:

>m@ryz:~$ ok=`echo \``
>bash: command substitution: Zeile 1: Dateiende beim Suchen nach »`«
>erreicht.
>bash: command substitution: Zeile 2: Syntaxfehler: Unerwartetes
>Dateiende.

Mit dem "\`" fängt eine zweite Substitution innerhalb der ersten
an, siehe Posting von Andreas.

Auf diesem Rechner hier habe ich keine bash, deshalb mit ksh:

| t20$ echo "$KSH_VERSION"
| @(#)PD KSH v5.2.14 99/07/13.2

| t20$ ok=`echo \``
| ksh: no closing quote

| t20$ ok=`echo \\\``

| t20$ echo "$ok".
| `.
| t20$

:-)

Marcel clio (415320)

[supersedes]
--
╭─────╮ ╭───╮ ╭─╮ ╭─╯
╰───╮ │ ╭───╮ ╭──╮ ╭─╮ │ ╰─╯ ╰──╮ ╭────╮ ╭─╯
╭────╯ ╰─╯ ╰─╮ ╭──╮ ╭─╮ │ ╰─╯ │ ╰──╮ ╭────╯ ╭─╯ ╭─╯ ╰─╮
╯ ╰────╯ ╰───╯ ╰─╯cc82fe╰─────╯ ╰───────╯ ╰────────╯

Helmut Waitzmann

unread,
Aug 25, 2022, 6:14:37 PM8/25/22
to
Michael Schütz <der.sc...@web.de>:
>Marco Moock <mo...@posteo.de> schrieb:

[Im Shell: «`…`» verglichen mit «$(…)»]


>> was ist da der Unterschied, so es einen gibt?
>>
>> Auf die Schnelle konnte ich keinen erkennen.
>>
>> Beide speichern die Standardausgabe des Befehls in einer
>> Variable.
>>
>> m@ryz:~$ OS=$(uname)
>> m@ryz:~$ OS=`uname`
>>
>Wenn ich es mir richtig gemerkt habe ist `` die alte, in jeder
>Shell funktionierende Methode und $() nur bei 'bash' und 'ksh'.

Das ist nicht mehr richtig: «$()» ist im POSIX‐Standard enthalten. 
Jeder Shell, der POSIX‐Kompatibilität behauptet, muss das können:
<https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_06_03>. 
Und wenn man sich anschaut, was dort über «`…`» geschrieben steht,
stehen einem die Haare zu Berge und man macht lieber einen großen
Bogen darum herum.  «$(…)» ist da eindeutig vorzuziehen.
--
Hat man erst verstanden, wie Unix funktioniert, ist auch
das Shell-Handbuch kein Buch mit sieben Siegeln mehr.

Helmut Waitzmann

unread,
Aug 25, 2022, 6:14:38 PM8/25/22
to
Marco Moock <mo...@posteo.de>:

[Im Shell «`…`» im Vergleich mit «$(…)»]


> was ist da der Unterschied, so es einen gibt?
>

Er ist nur syntaktischer Art, also, wie man das gewünschte
hinschreibt.  Wenn man im POSIX‐Standard (der beide Formen kennt)
bei
<https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_06_03>
nachliest, was dort zu «`…`» geschrieben steht, stehen einem die
Haare zu Berge (Zitat eingerückt, mein Kommentar nicht):

Within the backquoted style of command substitution,
<backslash> shall retain its literal meaning, except when
followed by: '$', '`', or <backslash>.  The search for
the matching backquote shall be satisfied by the first
unquoted non-escaped backquote; during this search, if a
non-escaped backquote is encountered within a shell
comment, a here-document, an embedded command
substitution of the $(command) form, or a quoted string,
undefined results occur.

Beispielsweise liefert die Kommandozeile


backquote=` printf '%s\n' '`' `

gemäß dem letzten Satzteil, der mit dem Strichpunkt beginnt,
«undefined results», denn das zweite «`» in der Zeile ist zwar
«quoted» aber dennoch «non‐escaped».

Das widerspricht der sonst allgemein geltenden Regel, dass
«'» alle Zeichen außer sich selbst ihrer Sonderbedeutung
beraubt und man deshalb alle Zeichen außer «'» mit «'»
einfassen kann, wenn man sie wörtlich (also ohne
syntaktische Sonderbedeutung) nehmen will.  So eine Ausnahme
ist für automatische Shell‐Skript‐Erstellung eine
Katastrophe.

A single-quoted or double-quoted string that begins, but
does not end, within the "`...`" sequence produces
undefined results.

Da steht's nochmal, umgekehrt formuliert:  In der Kommandozeile


backquote=` printf '%s\n' '`' `

beginnt der zweite Parameter von «printf» mit einem «'» (ist also
«single‐quoted»), ist aber nicht zu Ende, ehe ein «`» folgt.
0 new messages