4 ms·
Even better -- use this script, paste anything into stdin. It will come back out quotable and pasteable into a shell. #!/bin/bash printf '%q' "$(cat)"
by ctur 6y ago
Even better -- use this script, paste anything into stdin. It will come back out quotable and pasteable into a shell.
#!/bin/bash
printf '%q' "$(cat)"
echo
- Tepix 6y agoEven better, put this in your ~/.bashrc function bashquote () { printf '%q' "$(cat)" echo }
- asicsp 6y agoGolfed one-liner bashquote() { printf '%q\n' "$(cat)" ; }
- KMnO4 6y agoYou should contact your administrator if you are still paying per-line for your .bashrc
- dotancohen 6y agoI think he's just saving on keystokes because those Model M's are getting hard to find.
- Tepix 6y agoCan't we get rid of cat somehow?
- kps 6y agoYes, bashquote() { printf '%q\n' "$(</dev/stdin)"; } Bash treats the string "/dev/stdin" as magic, so that works even if /dev/stdin doesn't exist. However, bash (unlike ksh) spawns a subshell for $(</dev/stdin), so using cat is actually lighter. (Also, it's not clear to me why $(<&0) doesn't work in bash.)
- klysm 6y agoIs the echo there just for the newline? Why not slap a \n in there and make it a one liner?
- twic 6y ago$ echo "text with spaces" | bash -c 'printf "%q" "$(cat)"'; echo text\ with\ spaces For me, this escapes spaces with backslashes; the example in the article escapes them by quoting the whole string. Is this a difference in bash versions, or do these uses differ somehow? (I replaced the single quotes with double so i could pass this to bash -c, but i get the same result if i use your code verbatim as a script)
- asicsp 6y agotext\ with\ spaces is same as 'text with spaces' See https://mywiki.wooledge.org/Quotes https://mywiki.wooledge.org/Quotes
- twic 6y agoIt's plainly not the same, you can see that by looking at it. It encodes the same text, but it encodes it a different way. And the difference is not negligible. With quotes, i can type or paste more into the middle, and the string is still valid. With escapes, i have to be careful to escape the added text. It's significantly more ergonomic to use quoted text.
- eMSF 6y agoIf you intend to type or paste quotes, you still need some additional escaping. And on the other hand, most substrings of (non-quoted) escaped text are themselves properly escaped.
- kps 6y agoksh's %q prefers quotes; for your example it prints 'text with spaces', and for the article's example, $'This string \'has single\' "and double" quotes and a $' vs bash's %q, This\ string\ \'has\ single\'\ \"and\ double\"\ quotes\ and\ a\ \$
- zeroimpl 6y agoYes the example in the article and parent comments ought to be referred to as escaping, not quoting. Most of the time, quoting with single quotes leads to something far easier on the eyes. Here's an example function for quoting from stdin: function bashquotesingle() { printf "'"; sed "s/'/'\\\\''/g"; printf "'"; } Though it does have a bug, at least on macOS, where sed adds a trailing newline. (See https://stackoverflow.com/questions/13325138/why-does-sed-add-a-new-line-in-osx https://stackoverflow.com/questions/13325138/why-does-sed-ad...)
- birdyrooster 6y agoOr on Mac, just run this script and it will modify your clipboard #!/bin/bash printf '%q' "$(pbpaste)" | pbcopy