Because you already have single quotes in the string, use double quotes, and escape only the $
sign:
echo "\$(document).ready(function() {\$('#cf-footer-paragraph').append('<p>Revision 12345</p>');});"
When in doubt, read the source code. =)
Bash 4.3, shell.c
line 830, in function parse_shell_options()
:
/* A single `-' signals the end of options. From the 4.3 BSD sh.
An option `--' means the same thing; this is the standard
getopt(3) meaning. */
if (arg_string[0] == '-' &&
(arg_string[1] == '\0' ||
(arg_string[1] == '-' && arg_string[2] == '\0')))
return (next_arg);
In other words, the -
is saying that there are no more options. If there were any more words on the command line, they would be treated as a filename, even if the word started with a -
.
In your example, of course, that -
is completely redundant, as there is nothing following it anyway. In other words, bash -
is exactly equivalent to bash
.
Bash takes its commands
- from a script file if it's provided on the command line, or
- non-interactively from its stdin if its stdin is not a TTY (such as in your example: stdin is a pipe, so Bash will execute the contents of that URL as a script), or
- interactively if its stdin is a TTY.
It is a misconception that bash -
tells Bash to read its commands from its standard input. While it is true that in your example, Bash will read its commands from stdin, it would have done so regardless of whether there was a -
on the command line, because, as stated above, bash -
is identical to bash
.
To further illustrate that -
does not mean stdin, consider:
The cat
command is designed to interpret a -
as stdin. For example:
$ echo xxx | cat /etc/hosts - /etc/shells
127.0.0.1 localhost
xxx
# /etc/shells: valid login shells
/bin/sh
/bin/dash
/bin/bash
/bin/rbash
/bin/zsh
/usr/bin/zsh
/usr/bin/screen
/bin/tcsh
/usr/bin/tcsh
/usr/bin/tmux
/bin/ksh93
In contrast, you can't get Bash to execute /bin/date
then /bin/hostname
by trying this:
$ echo date | bash - hostname
/bin/hostname: /bin/hostname: cannot execute binary file
Rather, it tries to interpret /bin/hostname
as a shell script file, which fails because it's a bunch of binary gobbledygook.
You can't execute date +%s
using bash -
either.
$ date +%s
1448696965
$ echo date | bash -
Sat Nov 28 07:49:31 UTC 2015
$ echo date | bash - +%s
bash: +%s: No such file or directory
Can you write xargs bash
instead? No. curl | xargs bash
would invoke bash with the contents of the script as command-line arguments. The first word of the contents would be the first argument, and it would likely be misinterpreted as a script filename.
Best Answer
From
man bash
(somewhere after the line 3813):So, the
!$
will recall the last argument from the last command from history.Here are some examples and equivalents:
All of these will work only inside of an interactive shell. But if you use that command from your question inside of a script as you said that you sow it, then the things are different: when you run the script, this will start in a new shell, a non-interactive shell, so the history expansion doesn't has any effect in this case and so the command:
creates the file
!$
if not present (otherwise overwrites it) and writeAn Example
into it.