What is the difference between `a[bc]d` (brackets) and `ab,cd` (braces)?Using curly brackets (braces) to create folder structure with `mkdir -p`Short way to scp using the same dir/file in origin and targetQuoting curly braces in the shellIs there a Unix command that searches for similar strings, based mostly on how they sound when spoken?Bash expansion of $@ as commandHow can I suppress the space between generated arguments during brace expansion?Bash decimal to binary conversion explanationBraces don't work when there is a single elementBrace expansion and compound commandWhy doesn't systemctl restart,status sshd; work?

What is the strongest case that can be made in favour of the UK regaining some control over fishing policy after Brexit?

Why the difference in metal between 銀行 and お金?

Error message with tabularx

Single Colour Mastermind Problem

Will a top journal at least read my introduction?

Why isn't the definition of absolute value applied when squaring a radical containing a variable?

Why does nature favour the Laplacian?

Providence Pentominoes Puzzle By Andrew Bradburn (Jigsaw)

Why was Germany not as successful as other Europeans in establishing overseas colonies?

ConTeXt: MetaPost graphic in overlay setups shifts between pages

Was there a shared-world project before "Thieves World"?

Is there a way to get a compiler for the original B programming language?

How would one muzzle a full grown polar bear in the 13th century?

How can I change the color of a part of a line?

Is it possible to dynamically set properties of an `Object` using Apex?

Was there a Viking Exchange as well as a Columbian one?

How can Republicans who favour free markets, consistently express anger when they don't like the outcome of that choice?

Will tsunami waves travel forever if there was no land?

Why does processed meat contain preservatives, while canned fish needs not?

Is thermodynamics only applicable to systems in equilibrium?

How can the Zone of Truth spell be defeated without the caster knowing?

Can not tell colimits from limits

Is DC-to-DC (24 V to 12 V) buck conversion typically more efficient than AC-to-DC (110 V to 12 V) conversion?

Do vanished people know what happened after the snap?



What is the difference between `a[bc]d` (brackets) and `ab,cd` (braces)?


Using curly brackets (braces) to create folder structure with `mkdir -p`Short way to scp using the same dir/file in origin and targetQuoting curly braces in the shellIs there a Unix command that searches for similar strings, based mostly on how they sound when spoken?Bash expansion of $@ as commandHow can I suppress the space between generated arguments during brace expansion?Bash decimal to binary conversion explanationBraces don't work when there is a single elementBrace expansion and compound commandWhy doesn't systemctl restart,status sshd; work?






.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty margin-bottom:0;








9















What is the difference between a[bc]d and ab,cd? Why do people use ab,cd when there is already a[bc]d?










share|improve this question
























  • Who told you to use command a[bc]d?

    – Jesse_b
    18 hours ago






  • 2





    It certainly has its uses if one understands it correctly.

    – Weijun Zhou
    18 hours ago






  • 2





    I guess I just don't understand how the confusion between the two happened.

    – Jesse_b
    18 hours ago











  • I have been explicitly asked by a coworker less familiar with Linux on this, although not recently.

    – Weijun Zhou
    18 hours ago


















9















What is the difference between a[bc]d and ab,cd? Why do people use ab,cd when there is already a[bc]d?










share|improve this question
























  • Who told you to use command a[bc]d?

    – Jesse_b
    18 hours ago






  • 2





    It certainly has its uses if one understands it correctly.

    – Weijun Zhou
    18 hours ago






  • 2





    I guess I just don't understand how the confusion between the two happened.

    – Jesse_b
    18 hours ago











  • I have been explicitly asked by a coworker less familiar with Linux on this, although not recently.

    – Weijun Zhou
    18 hours ago














9












9








9


1






What is the difference between a[bc]d and ab,cd? Why do people use ab,cd when there is already a[bc]d?










share|improve this question
















What is the difference between a[bc]d and ab,cd? Why do people use ab,cd when there is already a[bc]d?







brace-expansion pattern-matching






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited 56 mins ago









muru

38.1k591166




38.1k591166










asked 18 hours ago









Weijun ZhouWeijun Zhou

1,842429




1,842429












  • Who told you to use command a[bc]d?

    – Jesse_b
    18 hours ago






  • 2





    It certainly has its uses if one understands it correctly.

    – Weijun Zhou
    18 hours ago






  • 2





    I guess I just don't understand how the confusion between the two happened.

    – Jesse_b
    18 hours ago











  • I have been explicitly asked by a coworker less familiar with Linux on this, although not recently.

    – Weijun Zhou
    18 hours ago


















  • Who told you to use command a[bc]d?

    – Jesse_b
    18 hours ago






  • 2





    It certainly has its uses if one understands it correctly.

    – Weijun Zhou
    18 hours ago






  • 2





    I guess I just don't understand how the confusion between the two happened.

    – Jesse_b
    18 hours ago











  • I have been explicitly asked by a coworker less familiar with Linux on this, although not recently.

    – Weijun Zhou
    18 hours ago

















Who told you to use command a[bc]d?

– Jesse_b
18 hours ago





Who told you to use command a[bc]d?

– Jesse_b
18 hours ago




2




2





It certainly has its uses if one understands it correctly.

– Weijun Zhou
18 hours ago





It certainly has its uses if one understands it correctly.

– Weijun Zhou
18 hours ago




2




2





I guess I just don't understand how the confusion between the two happened.

– Jesse_b
18 hours ago





I guess I just don't understand how the confusion between the two happened.

– Jesse_b
18 hours ago













I have been explicitly asked by a coworker less familiar with Linux on this, although not recently.

– Weijun Zhou
18 hours ago






I have been explicitly asked by a coworker less familiar with Linux on this, although not recently.

– Weijun Zhou
18 hours ago











2 Answers
2






active

oldest

votes


















18














The two are quite different.



a[bc]d is a filename pattern. It will expand to the two filenames abd and acd if those are names of existing files in the current directory.



  • The [...] part is a bracketed expression that matches a single character out of the ones listed. In this pattern, the character between a and d must be either a b or a c for the pattern to match.


  • If abd exists, but acd does not, then it would only expand to abd, and vice versa. By default, the pattern would remain unexpanded if there was no matching filename.


ab,cd is a brace expansion (in shells that support these). It will expand to the two strings abd and acd.



  • The ... part is a comma-delimited set of strings (in this example; it may also be a range such as a..k or 20..25), and the expansion is computed by combining each of these strings with the flanking strings a and d.


  • The expansion happens regardless of whether these strings corresponds to existing filenames or not.


If you are constructing strings, use a brace expansion. If you are matching filenames, use a filename pattern.






share|improve this answer

























  • Thank you for clarifying "If abd exists, but acd does not, then it would only expand to abd". I guess that is what is missing from my answer.

    – Weijun Zhou
    17 hours ago






  • 2





    Another crucial difference is that in ab,cd, the b and c parts don't need to be single letters; e.g. exten,cision. While ex[tenci]sion or whatever will only match one of these letters.

    – alexis
    1 hour ago











  • @alexis Thanks, I've made some changes.

    – Kusalananda
    1 hour ago


















3














a[bc]d is pattern-matching, and is part of the POSIX standard. In POSIX, this is introduced as the "pattern bracket expression". It is documented in section 2.13 of the manual




When unquoted and outside a bracket expression, the following three
characters shall have special meaning in the specification of
patterns:



    ?

      A question-mark is a pattern that shall match any character.

    *

      An asterisk is a pattern that shall match multiple characters, as
      described in Patterns Matching Multiple Characters.

    [

      The open bracket shall introduce a pattern bracket expression.


Section 2.13.3 also mentions something that it behaves differently from what one would expect for usual regexs when it is used for filename expansion (emphasis by me)




The rules described so far in Patterns Matching a Single Character and
Patterns Matching Multiple Characters are qualified by the following
rules that apply when pattern matching notation is used for filename
expansion:



The slash character in a pathname shall be explicitly matched by using
one or more slashes in the pattern; it shall neither be matched by the
asterisk or question-mark special characters nor by a bracket
expression. Slashes in the pattern shall be identified before bracket
expressions;
thus, a slash cannot be included in a pattern bracket
expression used for filename expansion. If a slash character is found
following an unescaped open square bracket character before a
corresponding closing square bracket is found, the open bracket shall
be treated as an ordinary character. For example, the pattern
"a[b/c]d" does not match such pathnames as abd or a/d.
It only matches a pathname of literally a[b/c]d.




ab,cd is braces expansion, it is not in the specification by POSIX. Here is the corresponding part from the bash manual (emphasis by me):




Brace expansion is a mechanism by which arbitrary strings may be
generated. This mechanism is similar to filename expansion (see
Filename Expansion), but the filenames generated need not exist.
Patterns to be brace expanded take the form of an optional preamble,
followed by either a series of comma-separated strings or a sequence
expression between a pair of braces, followed by an optional
postscript. The preamble is prefixed to each string contained within
the braces, and the postscript is then appended to each resulting
string, expanding left to right.




According to the comment by @mosvy, this first appeared from csh but the behavior in bash is different from csh and other shells. This type of braces expansion is also present in glob(3).



There is another type of braces expansion a..z that only appeared after bash 3.0, and there are more added in bash 4.0.



In a shell where globbing is turned on, execute in a empty folder, the following result is returned



$ echo a[bc]d
a[bc]d
$ echo ab,cd
abd acd


In response to @Jesse_b's comment, if you are in an interactive shell and both of them applies, a[bc]d is less trouble typing. For example grep pattern [ab][12].txt.






share|improve this answer




















  • 1





    The brace expansion is not a "bashism"; it first appeared in csh, long before bash. It's also present in the glob(3) library function. The difference is that in bash it's performed before other expansions: a=A; ab=A/B; ac=A/C; echo $ab,c will work in bash differently from any other shell.

    – mosvy
    16 hours ago











  • Thank you. I will update the answer.

    – Weijun Zhou
    16 hours ago











Your Answer








StackExchange.ready(function()
var channelOptions =
tags: "".split(" "),
id: "106"
;
initTagRenderer("".split(" "), "".split(" "), channelOptions);

StackExchange.using("externalEditor", function()
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled)
StackExchange.using("snippets", function()
createEditor();
);

else
createEditor();

);

function createEditor()
StackExchange.prepareEditor(
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: false,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: null,
bindNavPrevention: true,
postfix: "",
imageUploader:
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
,
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
);



);













draft saved

draft discarded


















StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2funix.stackexchange.com%2fquestions%2f515895%2fwhat-is-the-difference-between-abcd-brackets-and-ab-cd-braces%23new-answer', 'question_page');

);

Post as a guest















Required, but never shown

























2 Answers
2






active

oldest

votes








2 Answers
2






active

oldest

votes









active

oldest

votes






active

oldest

votes









18














The two are quite different.



a[bc]d is a filename pattern. It will expand to the two filenames abd and acd if those are names of existing files in the current directory.



  • The [...] part is a bracketed expression that matches a single character out of the ones listed. In this pattern, the character between a and d must be either a b or a c for the pattern to match.


  • If abd exists, but acd does not, then it would only expand to abd, and vice versa. By default, the pattern would remain unexpanded if there was no matching filename.


ab,cd is a brace expansion (in shells that support these). It will expand to the two strings abd and acd.



  • The ... part is a comma-delimited set of strings (in this example; it may also be a range such as a..k or 20..25), and the expansion is computed by combining each of these strings with the flanking strings a and d.


  • The expansion happens regardless of whether these strings corresponds to existing filenames or not.


If you are constructing strings, use a brace expansion. If you are matching filenames, use a filename pattern.






share|improve this answer

























  • Thank you for clarifying "If abd exists, but acd does not, then it would only expand to abd". I guess that is what is missing from my answer.

    – Weijun Zhou
    17 hours ago






  • 2





    Another crucial difference is that in ab,cd, the b and c parts don't need to be single letters; e.g. exten,cision. While ex[tenci]sion or whatever will only match one of these letters.

    – alexis
    1 hour ago











  • @alexis Thanks, I've made some changes.

    – Kusalananda
    1 hour ago















18














The two are quite different.



a[bc]d is a filename pattern. It will expand to the two filenames abd and acd if those are names of existing files in the current directory.



  • The [...] part is a bracketed expression that matches a single character out of the ones listed. In this pattern, the character between a and d must be either a b or a c for the pattern to match.


  • If abd exists, but acd does not, then it would only expand to abd, and vice versa. By default, the pattern would remain unexpanded if there was no matching filename.


ab,cd is a brace expansion (in shells that support these). It will expand to the two strings abd and acd.



  • The ... part is a comma-delimited set of strings (in this example; it may also be a range such as a..k or 20..25), and the expansion is computed by combining each of these strings with the flanking strings a and d.


  • The expansion happens regardless of whether these strings corresponds to existing filenames or not.


If you are constructing strings, use a brace expansion. If you are matching filenames, use a filename pattern.






share|improve this answer

























  • Thank you for clarifying "If abd exists, but acd does not, then it would only expand to abd". I guess that is what is missing from my answer.

    – Weijun Zhou
    17 hours ago






  • 2





    Another crucial difference is that in ab,cd, the b and c parts don't need to be single letters; e.g. exten,cision. While ex[tenci]sion or whatever will only match one of these letters.

    – alexis
    1 hour ago











  • @alexis Thanks, I've made some changes.

    – Kusalananda
    1 hour ago













18












18








18







The two are quite different.



a[bc]d is a filename pattern. It will expand to the two filenames abd and acd if those are names of existing files in the current directory.



  • The [...] part is a bracketed expression that matches a single character out of the ones listed. In this pattern, the character between a and d must be either a b or a c for the pattern to match.


  • If abd exists, but acd does not, then it would only expand to abd, and vice versa. By default, the pattern would remain unexpanded if there was no matching filename.


ab,cd is a brace expansion (in shells that support these). It will expand to the two strings abd and acd.



  • The ... part is a comma-delimited set of strings (in this example; it may also be a range such as a..k or 20..25), and the expansion is computed by combining each of these strings with the flanking strings a and d.


  • The expansion happens regardless of whether these strings corresponds to existing filenames or not.


If you are constructing strings, use a brace expansion. If you are matching filenames, use a filename pattern.






share|improve this answer















The two are quite different.



a[bc]d is a filename pattern. It will expand to the two filenames abd and acd if those are names of existing files in the current directory.



  • The [...] part is a bracketed expression that matches a single character out of the ones listed. In this pattern, the character between a and d must be either a b or a c for the pattern to match.


  • If abd exists, but acd does not, then it would only expand to abd, and vice versa. By default, the pattern would remain unexpanded if there was no matching filename.


ab,cd is a brace expansion (in shells that support these). It will expand to the two strings abd and acd.



  • The ... part is a comma-delimited set of strings (in this example; it may also be a range such as a..k or 20..25), and the expansion is computed by combining each of these strings with the flanking strings a and d.


  • The expansion happens regardless of whether these strings corresponds to existing filenames or not.


If you are constructing strings, use a brace expansion. If you are matching filenames, use a filename pattern.







share|improve this answer














share|improve this answer



share|improve this answer








edited 1 hour ago

























answered 17 hours ago









KusalanandaKusalananda

144k18271450




144k18271450












  • Thank you for clarifying "If abd exists, but acd does not, then it would only expand to abd". I guess that is what is missing from my answer.

    – Weijun Zhou
    17 hours ago






  • 2





    Another crucial difference is that in ab,cd, the b and c parts don't need to be single letters; e.g. exten,cision. While ex[tenci]sion or whatever will only match one of these letters.

    – alexis
    1 hour ago











  • @alexis Thanks, I've made some changes.

    – Kusalananda
    1 hour ago

















  • Thank you for clarifying "If abd exists, but acd does not, then it would only expand to abd". I guess that is what is missing from my answer.

    – Weijun Zhou
    17 hours ago






  • 2





    Another crucial difference is that in ab,cd, the b and c parts don't need to be single letters; e.g. exten,cision. While ex[tenci]sion or whatever will only match one of these letters.

    – alexis
    1 hour ago











  • @alexis Thanks, I've made some changes.

    – Kusalananda
    1 hour ago
















Thank you for clarifying "If abd exists, but acd does not, then it would only expand to abd". I guess that is what is missing from my answer.

– Weijun Zhou
17 hours ago





Thank you for clarifying "If abd exists, but acd does not, then it would only expand to abd". I guess that is what is missing from my answer.

– Weijun Zhou
17 hours ago




2




2





Another crucial difference is that in ab,cd, the b and c parts don't need to be single letters; e.g. exten,cision. While ex[tenci]sion or whatever will only match one of these letters.

– alexis
1 hour ago





Another crucial difference is that in ab,cd, the b and c parts don't need to be single letters; e.g. exten,cision. While ex[tenci]sion or whatever will only match one of these letters.

– alexis
1 hour ago













@alexis Thanks, I've made some changes.

– Kusalananda
1 hour ago





@alexis Thanks, I've made some changes.

– Kusalananda
1 hour ago













3














a[bc]d is pattern-matching, and is part of the POSIX standard. In POSIX, this is introduced as the "pattern bracket expression". It is documented in section 2.13 of the manual




When unquoted and outside a bracket expression, the following three
characters shall have special meaning in the specification of
patterns:



    ?

      A question-mark is a pattern that shall match any character.

    *

      An asterisk is a pattern that shall match multiple characters, as
      described in Patterns Matching Multiple Characters.

    [

      The open bracket shall introduce a pattern bracket expression.


Section 2.13.3 also mentions something that it behaves differently from what one would expect for usual regexs when it is used for filename expansion (emphasis by me)




The rules described so far in Patterns Matching a Single Character and
Patterns Matching Multiple Characters are qualified by the following
rules that apply when pattern matching notation is used for filename
expansion:



The slash character in a pathname shall be explicitly matched by using
one or more slashes in the pattern; it shall neither be matched by the
asterisk or question-mark special characters nor by a bracket
expression. Slashes in the pattern shall be identified before bracket
expressions;
thus, a slash cannot be included in a pattern bracket
expression used for filename expansion. If a slash character is found
following an unescaped open square bracket character before a
corresponding closing square bracket is found, the open bracket shall
be treated as an ordinary character. For example, the pattern
"a[b/c]d" does not match such pathnames as abd or a/d.
It only matches a pathname of literally a[b/c]d.




ab,cd is braces expansion, it is not in the specification by POSIX. Here is the corresponding part from the bash manual (emphasis by me):




Brace expansion is a mechanism by which arbitrary strings may be
generated. This mechanism is similar to filename expansion (see
Filename Expansion), but the filenames generated need not exist.
Patterns to be brace expanded take the form of an optional preamble,
followed by either a series of comma-separated strings or a sequence
expression between a pair of braces, followed by an optional
postscript. The preamble is prefixed to each string contained within
the braces, and the postscript is then appended to each resulting
string, expanding left to right.




According to the comment by @mosvy, this first appeared from csh but the behavior in bash is different from csh and other shells. This type of braces expansion is also present in glob(3).



There is another type of braces expansion a..z that only appeared after bash 3.0, and there are more added in bash 4.0.



In a shell where globbing is turned on, execute in a empty folder, the following result is returned



$ echo a[bc]d
a[bc]d
$ echo ab,cd
abd acd


In response to @Jesse_b's comment, if you are in an interactive shell and both of them applies, a[bc]d is less trouble typing. For example grep pattern [ab][12].txt.






share|improve this answer




















  • 1





    The brace expansion is not a "bashism"; it first appeared in csh, long before bash. It's also present in the glob(3) library function. The difference is that in bash it's performed before other expansions: a=A; ab=A/B; ac=A/C; echo $ab,c will work in bash differently from any other shell.

    – mosvy
    16 hours ago











  • Thank you. I will update the answer.

    – Weijun Zhou
    16 hours ago















3














a[bc]d is pattern-matching, and is part of the POSIX standard. In POSIX, this is introduced as the "pattern bracket expression". It is documented in section 2.13 of the manual




When unquoted and outside a bracket expression, the following three
characters shall have special meaning in the specification of
patterns:



    ?

      A question-mark is a pattern that shall match any character.

    *

      An asterisk is a pattern that shall match multiple characters, as
      described in Patterns Matching Multiple Characters.

    [

      The open bracket shall introduce a pattern bracket expression.


Section 2.13.3 also mentions something that it behaves differently from what one would expect for usual regexs when it is used for filename expansion (emphasis by me)




The rules described so far in Patterns Matching a Single Character and
Patterns Matching Multiple Characters are qualified by the following
rules that apply when pattern matching notation is used for filename
expansion:



The slash character in a pathname shall be explicitly matched by using
one or more slashes in the pattern; it shall neither be matched by the
asterisk or question-mark special characters nor by a bracket
expression. Slashes in the pattern shall be identified before bracket
expressions;
thus, a slash cannot be included in a pattern bracket
expression used for filename expansion. If a slash character is found
following an unescaped open square bracket character before a
corresponding closing square bracket is found, the open bracket shall
be treated as an ordinary character. For example, the pattern
"a[b/c]d" does not match such pathnames as abd or a/d.
It only matches a pathname of literally a[b/c]d.




ab,cd is braces expansion, it is not in the specification by POSIX. Here is the corresponding part from the bash manual (emphasis by me):




Brace expansion is a mechanism by which arbitrary strings may be
generated. This mechanism is similar to filename expansion (see
Filename Expansion), but the filenames generated need not exist.
Patterns to be brace expanded take the form of an optional preamble,
followed by either a series of comma-separated strings or a sequence
expression between a pair of braces, followed by an optional
postscript. The preamble is prefixed to each string contained within
the braces, and the postscript is then appended to each resulting
string, expanding left to right.




According to the comment by @mosvy, this first appeared from csh but the behavior in bash is different from csh and other shells. This type of braces expansion is also present in glob(3).



There is another type of braces expansion a..z that only appeared after bash 3.0, and there are more added in bash 4.0.



In a shell where globbing is turned on, execute in a empty folder, the following result is returned



$ echo a[bc]d
a[bc]d
$ echo ab,cd
abd acd


In response to @Jesse_b's comment, if you are in an interactive shell and both of them applies, a[bc]d is less trouble typing. For example grep pattern [ab][12].txt.






share|improve this answer




















  • 1





    The brace expansion is not a "bashism"; it first appeared in csh, long before bash. It's also present in the glob(3) library function. The difference is that in bash it's performed before other expansions: a=A; ab=A/B; ac=A/C; echo $ab,c will work in bash differently from any other shell.

    – mosvy
    16 hours ago











  • Thank you. I will update the answer.

    – Weijun Zhou
    16 hours ago













3












3








3







a[bc]d is pattern-matching, and is part of the POSIX standard. In POSIX, this is introduced as the "pattern bracket expression". It is documented in section 2.13 of the manual




When unquoted and outside a bracket expression, the following three
characters shall have special meaning in the specification of
patterns:



    ?

      A question-mark is a pattern that shall match any character.

    *

      An asterisk is a pattern that shall match multiple characters, as
      described in Patterns Matching Multiple Characters.

    [

      The open bracket shall introduce a pattern bracket expression.


Section 2.13.3 also mentions something that it behaves differently from what one would expect for usual regexs when it is used for filename expansion (emphasis by me)




The rules described so far in Patterns Matching a Single Character and
Patterns Matching Multiple Characters are qualified by the following
rules that apply when pattern matching notation is used for filename
expansion:



The slash character in a pathname shall be explicitly matched by using
one or more slashes in the pattern; it shall neither be matched by the
asterisk or question-mark special characters nor by a bracket
expression. Slashes in the pattern shall be identified before bracket
expressions;
thus, a slash cannot be included in a pattern bracket
expression used for filename expansion. If a slash character is found
following an unescaped open square bracket character before a
corresponding closing square bracket is found, the open bracket shall
be treated as an ordinary character. For example, the pattern
"a[b/c]d" does not match such pathnames as abd or a/d.
It only matches a pathname of literally a[b/c]d.




ab,cd is braces expansion, it is not in the specification by POSIX. Here is the corresponding part from the bash manual (emphasis by me):




Brace expansion is a mechanism by which arbitrary strings may be
generated. This mechanism is similar to filename expansion (see
Filename Expansion), but the filenames generated need not exist.
Patterns to be brace expanded take the form of an optional preamble,
followed by either a series of comma-separated strings or a sequence
expression between a pair of braces, followed by an optional
postscript. The preamble is prefixed to each string contained within
the braces, and the postscript is then appended to each resulting
string, expanding left to right.




According to the comment by @mosvy, this first appeared from csh but the behavior in bash is different from csh and other shells. This type of braces expansion is also present in glob(3).



There is another type of braces expansion a..z that only appeared after bash 3.0, and there are more added in bash 4.0.



In a shell where globbing is turned on, execute in a empty folder, the following result is returned



$ echo a[bc]d
a[bc]d
$ echo ab,cd
abd acd


In response to @Jesse_b's comment, if you are in an interactive shell and both of them applies, a[bc]d is less trouble typing. For example grep pattern [ab][12].txt.






share|improve this answer















a[bc]d is pattern-matching, and is part of the POSIX standard. In POSIX, this is introduced as the "pattern bracket expression". It is documented in section 2.13 of the manual




When unquoted and outside a bracket expression, the following three
characters shall have special meaning in the specification of
patterns:



    ?

      A question-mark is a pattern that shall match any character.

    *

      An asterisk is a pattern that shall match multiple characters, as
      described in Patterns Matching Multiple Characters.

    [

      The open bracket shall introduce a pattern bracket expression.


Section 2.13.3 also mentions something that it behaves differently from what one would expect for usual regexs when it is used for filename expansion (emphasis by me)




The rules described so far in Patterns Matching a Single Character and
Patterns Matching Multiple Characters are qualified by the following
rules that apply when pattern matching notation is used for filename
expansion:



The slash character in a pathname shall be explicitly matched by using
one or more slashes in the pattern; it shall neither be matched by the
asterisk or question-mark special characters nor by a bracket
expression. Slashes in the pattern shall be identified before bracket
expressions;
thus, a slash cannot be included in a pattern bracket
expression used for filename expansion. If a slash character is found
following an unescaped open square bracket character before a
corresponding closing square bracket is found, the open bracket shall
be treated as an ordinary character. For example, the pattern
"a[b/c]d" does not match such pathnames as abd or a/d.
It only matches a pathname of literally a[b/c]d.




ab,cd is braces expansion, it is not in the specification by POSIX. Here is the corresponding part from the bash manual (emphasis by me):




Brace expansion is a mechanism by which arbitrary strings may be
generated. This mechanism is similar to filename expansion (see
Filename Expansion), but the filenames generated need not exist.
Patterns to be brace expanded take the form of an optional preamble,
followed by either a series of comma-separated strings or a sequence
expression between a pair of braces, followed by an optional
postscript. The preamble is prefixed to each string contained within
the braces, and the postscript is then appended to each resulting
string, expanding left to right.




According to the comment by @mosvy, this first appeared from csh but the behavior in bash is different from csh and other shells. This type of braces expansion is also present in glob(3).



There is another type of braces expansion a..z that only appeared after bash 3.0, and there are more added in bash 4.0.



In a shell where globbing is turned on, execute in a empty folder, the following result is returned



$ echo a[bc]d
a[bc]d
$ echo ab,cd
abd acd


In response to @Jesse_b's comment, if you are in an interactive shell and both of them applies, a[bc]d is less trouble typing. For example grep pattern [ab][12].txt.







share|improve this answer














share|improve this answer



share|improve this answer








edited 8 hours ago









G-Man

13.9k93870




13.9k93870










answered 18 hours ago









Weijun ZhouWeijun Zhou

1,842429




1,842429







  • 1





    The brace expansion is not a "bashism"; it first appeared in csh, long before bash. It's also present in the glob(3) library function. The difference is that in bash it's performed before other expansions: a=A; ab=A/B; ac=A/C; echo $ab,c will work in bash differently from any other shell.

    – mosvy
    16 hours ago











  • Thank you. I will update the answer.

    – Weijun Zhou
    16 hours ago












  • 1





    The brace expansion is not a "bashism"; it first appeared in csh, long before bash. It's also present in the glob(3) library function. The difference is that in bash it's performed before other expansions: a=A; ab=A/B; ac=A/C; echo $ab,c will work in bash differently from any other shell.

    – mosvy
    16 hours ago











  • Thank you. I will update the answer.

    – Weijun Zhou
    16 hours ago







1




1





The brace expansion is not a "bashism"; it first appeared in csh, long before bash. It's also present in the glob(3) library function. The difference is that in bash it's performed before other expansions: a=A; ab=A/B; ac=A/C; echo $ab,c will work in bash differently from any other shell.

– mosvy
16 hours ago





The brace expansion is not a "bashism"; it first appeared in csh, long before bash. It's also present in the glob(3) library function. The difference is that in bash it's performed before other expansions: a=A; ab=A/B; ac=A/C; echo $ab,c will work in bash differently from any other shell.

– mosvy
16 hours ago













Thank you. I will update the answer.

– Weijun Zhou
16 hours ago





Thank you. I will update the answer.

– Weijun Zhou
16 hours ago

















draft saved

draft discarded
















































Thanks for contributing an answer to Unix & Linux Stack Exchange!


  • Please be sure to answer the question. Provide details and share your research!

But avoid


  • Asking for help, clarification, or responding to other answers.

  • Making statements based on opinion; back them up with references or personal experience.

To learn more, see our tips on writing great answers.




draft saved


draft discarded














StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2funix.stackexchange.com%2fquestions%2f515895%2fwhat-is-the-difference-between-abcd-brackets-and-ab-cd-braces%23new-answer', 'question_page');

);

Post as a guest















Required, but never shown





















































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown

































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown







Popular posts from this blog

Magento 2 duplicate PHPSESSID cookie when using session_start() in custom php scriptMagento 2: User cant logged in into to account page, no error showing!Magento duplicate on subdomainGrabbing storeview from cookie (after using language selector)How do I run php custom script on magento2Magento 2: Include PHP script in headerSession lock after using Cm_RedisSessionscript php to update stockMagento set cookie popupMagento 2 session id cookie - where to find it?How to import Configurable product from csv with custom attributes using php scriptMagento 2 run custom PHP script

Can not update quote_id field of “quote_item” table magento 2Magento 2.1 - We can't remove the item. (Shopping Cart doesnt allow us to remove items before becomes empty)Add value for custom quote item attribute using REST apiREST API endpoint v1/carts/cartId/items always returns error messageCorrect way to save entries to databaseHow to remove all associated quote objects of a customer completelyMagento 2 - Save value from custom input field to quote_itemGet quote_item data using quote id and product id filter in Magento 2How to set additional data to quote_item table from controller in Magento 2?What is the purpose of additional_data column in quote_item table in magento2Set Custom Price to Quote item magento2 from controller

How to solve knockout JS error in Magento 2 Planned maintenance scheduled April 23, 2019 at 23:30 UTC (7:30pm US/Eastern) Announcing the arrival of Valued Associate #679: Cesar Manara Unicorn Meta Zoo #1: Why another podcast?(Magento2) knockout.js:3012 Uncaught ReferenceError: Unable to process bindingUnable to process binding Knockout.js magento 2Cannot read property `scopeLabel` of undefined on Product Detail PageCan't get Customer Data on frontend in Magento 2Magento2 Order Summary - unable to process bindingKO templates are not loading in Magento 2.1 applicationgetting knockout js error magento 2Product grid not load -— Unable to process binding Knockout.js magento 2Product form not loaded in magento2Uncaught ReferenceError: Unable to process binding “if: function()return (isShowLegend()) ” magento 2