Path: csiph.com!goblin1!goblin.stu.neva.ru!usenet.stanford.edu!not-for-mail From: Jim Monte Newsgroups: gnu.bash.bug Subject: Re: Issues with history substitution and its documentation Date: Thu, 10 Oct 2019 22:35:26 -0400 Lines: 308 Approved: bug-bash@gnu.org Message-ID: References: NNTP-Posting-Host: lists.gnu.org Mime-Version: 1.0 Content-Type: text/plain; charset="UTF-8" X-Trace: usenet.stanford.edu 1570761347 14354 209.51.188.17 (11 Oct 2019 02:35:47 GMT) X-Complaints-To: action@cs.stanford.edu To: bug-bash@gnu.org Envelope-to: bug-bash@gnu.org DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:references:in-reply-to:from:date:message-id:subject:to; bh=2la8CM8b8wQOlL/G/8YPud1YYuhYs42A61JHXzK86Zs=; b=Nv7eP7z+3Xg9DuGiNcbkg+pOCUeCe0ClHFZXNRlpjs4yIT4o1jXuafpZnFNYMQlPYM HcllRayaLNW6OuGVKp14GBL6Pf7ON+vA6Gkt7nVOzsrF/Hi3Z97pg/hSZwBDZV7sbcan MmoBXLkIE1BVF+r5FdyGzFhU+F+wpwwvAWZl4s5PbDZNYdVK7FvkA4YHeXWUa36bjTT9 BcSVEf0auvPSFRhMLCX4GU57BsZyEDlNcuzAEXneFCtsxjpXK4BwCUZsjUoh6oADKRmk SIbM/eyBfdeYEXKXMn3URn6g2Y3OsFqYcx7x2rtdvhS99IdeshkQPcPIXdzvn9k1on4i lazA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to; bh=2la8CM8b8wQOlL/G/8YPud1YYuhYs42A61JHXzK86Zs=; b=svFMR7VlHhml7M/fjmC4c1ubpGVgpRGXir1jrwKlqKGNf18AntBzAI2OCKmPo814q7 etNNRb1n0kRzkUnGA6Z9nm+yX75KDV5EG0Wf76xtmU8WO7ebiCHlypMv0+UNo3J1XnFl HBcLiUNtTRmVzTtfrrWIpPemzTRWKbgC6y2j7K+7w8paINuNuPd8HSp9/6q7BCGDfxDl ODw+ZiSCfKAiH2ywrudrcFqXlZx0nBEZkTpiRwlJ3nKXcW2ebJH2X/tpdOT6JKgToH4Z 0DuBZM765pzbGA5eCAEY2uKSkWLgPmWy2NDd8Y4I79/aH5/rWHzjzHf1ywuTl2umb8a8 Pa1Q== X-Gm-Message-State: APjAAAUeB5PAtuGGqyE4BxP8FmU7m2qKTLVddiSs+TgmJOUpHJu23oQp WyZb/36769ZeyT83eDqHO56qrWNcff/LGduEyEQGNOvS X-Google-Smtp-Source: APXvYqxQzVBUtf1dHGdLa3NE4g3NBTKO029BHC3X1cXkC+UUcvsNijACEXP82HUN5nw7DbnSUHac9TRjrP1OTyaMpSA= X-Received: by 2002:a05:6638:695:: with SMTP id i21mr7519769jab.122.1570761337676; Thu, 10 Oct 2019 19:35:37 -0700 (PDT) In-Reply-To: X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:4864:20::d29 X-Content-Filtered-By: Mailman/MimeDel 2.1.23 X-BeenThere: bug-bash@gnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Bug reports for the GNU Bourne Again SHell List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Mailman-Original-Message-ID: X-Mailman-Original-References: Xref: csiph.com gnu.bash.bug:15493 Hi, This bug report has been my first one for Bash. I have not found how to check the status of the bug. Would you please provide this information? Below are a couple more issues I found. There is an inconsistency with the documentation and behavior of the ^ word designator. According to documentation, it refers to the first argument but does not require a ':' before it if it starts the word designator. However, it does not act like the numerical word designator 1 at the end of a range. [root@localhost ~]# echo a b c a b c [root@localhost ~]# echo !!:1-1 echo a a [root@localhost ~]# echo a b c a b c [root@localhost ~]# echo !!:^-^ echo a b^ a b^ Also it is not explicitly documented that :- is equivalent to :0- [root@localhost ~]# echo a b c d a b c d [root@localhost ~]# echo !!:- echo echo a b c echo a b c [root@localhost ~]# echo a b c d a b c d [root@localhost ~]# echo !!:0- echo echo a b c echo a b c Jim Monte On Thu, Oct 3, 2019 at 6:19 PM Jim Monte wrote: > Hi All, > > Below are some issues I found with history substitution. I am duplicating > its behavior in a somewhat different use, and found issues with the > documentation and bugs as described. > > Jim Monte > > > > > From: jim > To: bug-bash@gnu.org > Subject: Issues with history substitution and its documentation > > Configuration Information [Automatically generated, do not change]: > Machine: x86_64 > OS: linux-gnu > Compiler: gcc > Compilation CFLAGS: -DPROGRAM='bash' -DCONF_HOSTTYPE='x86_64' > -DCONF_OSTYPE='l$ > uname output: Linux T5500-Ubuntu 4.18.0-22-generic #23~18.04.1-Ubuntu SMP > Thu J$ > Machine Type: x86_64-pc-linux-gnu > > Bash Version: 4.4 > Patch Level: 19 > Release Status: release > > Description: > > ============================================================================= > Documentation of quick substitution is incorrect (or does not match > behavior). > > I believe this issue is an error with the documentation of history > "Quick Substitution" that has existed since the first snapshot available at > web.archive.org in 2007 at > > > https://web.archive.org/web/20071223174140/http://www.gnu.org/software/bash/manual/html_node/Event-Designators.html > > At the least it is true that bash does not behave as the documentation > states, > but it does act in a way that is more reasonable (to me) than what is > written. > > The documentation states that ^string1^string2^ is equivalent to > !!:s/string1/string2/. However, bash treats it as equivalent to > !!:s^string1^string2^. > > jim@T5500-Ubuntu:~$ echo /a > /a > jim@T5500-Ubuntu:~$ ^/a^b^ > echo b > b > jim@T5500-Ubuntu:~$ echo /a > /a > jim@T5500-Ubuntu:~$ !!:s//a/b/ > echo ab/ > ab/ > jim@T5500-Ubuntu:~$ echo /a > /a > jim@T5500-Ubuntu:~$ !!:s^/a^b^ > echo b > b > > > ============================================================================= > Behavior of empty "old" string in a substitution is undefined. > > The earlier example also shows a related but different issue with the > !!:s//a/b/ command, where the string to locate is empty. > It causes /a to be replaced by a and the b/ is appended. > > But > jim@T5500-Ubuntu:~$ echo ///a > ///a > jim@T5500-Ubuntu:~$ !!:s//z/ > echo //z > //z > > Here the empty string caused /a to be replaced by z. > > However, > jim@T5500-Ubuntu:~$ echo ///abcdefg > ///abcdefg > jim@T5500-Ubuntu:~$ !!:s//z/ > echo //zbcdefg > //zbcdefg > > Here a slash and the first character of the second word are replaced by z. > > > jim@T5500-Ubuntu:~$ echo a b c > a b c > jim@T5500-Ubuntu:~$ !!:s//z/ > echo z b c > z b c > > > jim@T5500-Ubuntu:~$ echo /// > /// > jim@T5500-Ubuntu:~$ !!:s//z/ > bash: :s//z/: substitution failed > > Using :gs instead of :s does not change the results. > > > ============================================================================= > BUG > If an event designator has a leading - character, it is ignored. > > jim@T5500-Ubuntu:~/tmp$ cat main.c > #include > int main(void) > { > (void) fprintf(stdout, "Hello, world!\n"); > return 0; > } > > jim@T5500-Ubuntu:~/tmp$ gcc main.c -o"-a" > jim@T5500-Ubuntu:~/tmp$ gcc main.c -o"-b" > jim@T5500-Ubuntu:~/tmp$ -a > Hello, world! > jim@T5500-Ubuntu:~/tmp$ !-a:s/a/b > bpt-cache abc > > > > ============================================================================= > Documentation of the :h and :t modifiers in section 9.3.3 is incomplete. > :h removes the last / and everything after it if a / is present. Otherwise > it does nothing. > > :t removes everything before and including the last / if one is present. > Otherwise it does nothing. > > If a slash is present, !!:h/!!:t is equivalent to !!. > > jim@T5500-Ubuntu:~$ echo /a/b/c/d > /a/b/c/d > jim@T5500-Ubuntu:~$ !!:h > echo /a/b/c > /a/b/c > jim@T5500-Ubuntu:~$ echo /a/b/c/d > /a/b/c/d > jim@T5500-Ubuntu:~$ !!:h:h > echo /a/b > /a/b > jim@T5500-Ubuntu:~$ echo /a/b/c/d > /a/b/c/d > jim@T5500-Ubuntu:~$ !!:h:h:h > echo /a > /a > jim@T5500-Ubuntu:~$ echo /a/b/c/d > /a/b/c/d > jim@T5500-Ubuntu:~$ !!:h:h:h:h > echo > > jim@T5500-Ubuntu:~$ > jim@T5500-Ubuntu:~$ echo /a/b/c/d > /a/b/c/d > jim@T5500-Ubuntu:~$ !!:t > d > d: command not found > > > jim@T5500-Ubuntu:~$ echo a/b > a/b > jim@T5500-Ubuntu:~$ !!:h/!!:t > echo a/b > a/b > jim@T5500-Ubuntu:~$ echo a/b > a/b > jim@T5500-Ubuntu:~$ !! > echo a/b > a/b > > > > ============================================================================= > Documentation of the :r and :e modifiers is incomplete. > :r removes the last ".suffix" and everything after it, if a ".suffix" is > present. Otherwise it does nothing. > :e leaves the last ".suffix" and everything after it, if a ".suffix" is > present. Otherwise it does nothing. > > jim@T5500-Ubuntu:~$ echo .suffix a b .suffix c d > .suffix a b .suffix c d > jim@T5500-Ubuntu:~$ !!:r > echo .suffix a b > .suffix a b > jim@T5500-Ubuntu:~$ echo .suffix a b .suffix c d > .suffix a b .suffix c d > jim@T5500-Ubuntu:~$ !!:r:r > echo > > jim@T5500-Ubuntu:~$ echo .suffix a b .suffix c d > .suffix a b .suffix c d > jim@T5500-Ubuntu:~$ !!:e > .suffix c d > > jim@T5500-Ubuntu:~$ echo a b c > a b c > jim@T5500-Ubuntu:~$ !!:r > echo a b c > a b c > jim@T5500-Ubuntu:~$ echo a b c > a b c > jim@T5500-Ubuntu:~$ !!:e > echo a b c > a b c > > > ============================================================================= > BUG > :p does not suppress execution if it is duplicated. > > jim@T5500-Ubuntu:~$ echo a b c > a b c > jim@T5500-Ubuntu:~$ !!:p > echo a b c > jim@T5500-Ubuntu:~$ echo a b c > a b c > jim@T5500-Ubuntu:~$ !!:p:p > echo a b c > a b c > > > ============================================================================= > Documentation of :q and :x is incomplete. > If :q and :x are repeated, the last specification is taken. > > jim@T5500-Ubuntu:~$ echo a b c > a b c > jim@T5500-Ubuntu:~$ !!:q > 'echo a b c' > echo a b c: command not found > jim@T5500-Ubuntu:~$ echo a b c > a b c > jim@T5500-Ubuntu:~$ !!:x > 'echo' 'a' 'b' 'c' > a b c > jim@T5500-Ubuntu:~$ echo a b c > a b c > jim@T5500-Ubuntu:~$ !!:q:x > 'echo' 'a' 'b' 'c' > a b c > jim@T5500-Ubuntu:~$ echo a b c > a b c > jim@T5500-Ubuntu:~$ !!:q:x:q > 'echo a b c' > echo a b c: command not found > jim@T5500-Ubuntu:~$ echo a b c > a b c > jim@T5500-Ubuntu:~$ !!:q:x:q:x > 'echo' 'a' 'b' 'c' > a b c > > > ============================================================================= > Finally, documentation of G should mention that it can be used with both > :s and &. > > >