shQuote {base} | R Documentation |
Quote Strings for Use in OS Shells
Description
Quote a string to be passed to an operating system shell.
Usage
shQuote(string, type = c("sh", "csh", "cmd", "cmd2"))
Arguments
string |
a character vector, usually of length one. |
type |
character: the type of shell quoting. Partial matching is
supported. |
Details
The default type of quoting supported under Unix-alikes is that for
the Bourne shell sh
. If the string does not contain single
quotes, we can just surround it with single quotes. Otherwise, the
string is surrounded in double quotes, which suppresses all special
meanings of metacharacters except dollar, backquote and backslash, so
these (and of course double quote) are preceded by backslash. This
type of quoting is also appropriate for bash
, ksh
and
zsh
.
The other type of quoting is for the C-shell (csh
and
tcsh
). Once again, if the string does not contain single
quotes, we can just surround it with single quotes. If it does
contain single quotes, we can use double quotes provided it does not
contain dollar or backquote (and we need to escape backslash,
exclamation mark and double quote). As a last resort, we need to
split the string into pieces not containing single quotes (some may be
empty) and surround each with single quotes, and the single quotes
with double quotes.
In Windows, command line interpretation is done by the application as well
as the shell. It may depend on the compiler used: Microsoft's rules for
the C run-time are given at
https://learn.microsoft.com/en-us/cpp/c-language/parsing-c-command-line-arguments?view=msvc-160.
It may depend on the whim of the programmer of the application: check its
documentation. The type = "cmd"
prepares the string for parsing as
an argument by the Microsoft's rules and makes shQuote
safe for use
with many applications when used with system
or
system2
. It surrounds the string by double quotes and
escapes internal double quotes by a backslash. Any trailing backslashes
and backslashes that were originally before double quotes are doubled.
The Windows
cmd.exe
shell (used by default with shell
)
uses type = "cmd2"
quoting: special characters are prefixed
with "^"
. In some cases, two types of quoting should be
used: first for the application, and then type = "cmd2"
for cmd.exe
. See the examples below.
Value
A character vector of the same length as string
.
References
Loukides, M. et al (2002) Unix Power Tools Third Edition. O'Reilly. Section 27.12.
Discussion in PR#16636.
See Also
Quotes for quoting R code.
sQuote
for quoting English text.
Examples
test <- "abc$def`gh`i\\j"
cat(shQuote(test), "\n")
## Not run: system(paste("echo", shQuote(test)))
test <- "don't do it!"
cat(shQuote(test), "\n")
tryit <- paste("use the", sQuote("-c"), "switch\nlike this")
cat(shQuote(tryit), "\n")
## Not run: system(paste("echo", shQuote(tryit)))
cat(shQuote(tryit, type = "csh"), "\n")
## Windows-only example, assuming cmd.exe:
perlcmd <- 'print "Hello World\\n";'
## Not run:
shell(shQuote(paste("perl -e",
shQuote(perlcmd, type = "cmd")),
type = "cmd2"))
## End(Not run)