"quote" command in the shell

What is the usage of the command quote? I haven't found any info about it, it isn't among the executable files in /bin folders, and it cannot be found among Bash built-ins. It seems that it only prints its first parameter, like an echo command and nothing more.


Solution 1:

What is it?

I noticed that this command does not work in my shell (fish, friendly interactive shell). It seems like it does only work in bash (Ubuntu's default).

chocobai@pc ~> /bin/bash 
chocobai@pc:~$ quote asdf
'asdf'chocobai@pc:~$ 

chocobai@pc:~$ type quote
quote is a function.
quote ()
{ 
    local quoted=${1//\'/\'\\\'\'};
    printf "'%s'" "$quoted"
}

What does it do? What can it be used for?

It adds the quotes but no newline. It also escapes single quotes in a way that's suitable for bash. It can be useful in scripts to quote a variable or some other kind of string. You need this for example for paths/parameters with spaces. Although there are other ways to do this.

It's really strange I could not find any documentation (in the web) about it. But well, it's easy to see what it does.

Solution 2:

quote is a function that is defined (here on my Debian system, but I guess it's the same on Ubuntu) in the file /usr/share/bash-completion/bash_completion, which itself is sourced by /etc/bash.bashrc at Bash's startup.

I would never use this function! If you need to quote stuff so as to be safely usable by a shell, please use printf with the %q modifier, as:

printf '%q\n' "Hello my friend I like 'single quotes' as well as \"double quotes\""

In fact, even this is very rarely used, there are always better strategies for high-level stuff as we, users, usually do. This quote thing is used internally by some obscure stuff we don't even want to know about. This quote function is probably a vendor/distribution-specific (read Debian-specific) and is probably not portable at all, and might even change in future releases.

Edit. I've just checked on an Ubuntu 12.04 system, and the quote function is defined in /etc/bash_completion, sourced by /etc/bash.bashrc, itself sourced by /etc/profile.

How did I determine this? using a little of heuristic:

  • Check if quote appears in /etc/profile:

    grep '\bquote\b' /etc/profile
    

    No. Go to next step.

  • What are the files sourced by /etc/profile?

    grep '[[:space:]]\.[[:space:]]' /etc/profile
    

    I have $i (need to look into the source for what this sources, but in this case it's the files /etc/profile.d/*.sh if any (and if readable) and /etc/bash.bashrc. Looking in /etc/bash.bashrc.

  • Is quote in /etc/bash.bashrc? yes/no , etc...

Solution 3:

quote is a function:

quote () 
{ 
    local quoted=${1//\'/\'\\\'\'};
    printf "'%s'" "$quoted"
}

This function is defined somewhere in a bash initialization file. More precisely, if you are using Ubuntu 13.04, you can find it in /usr/share/bash-completion/bash_completion at the line 142.

Use the following command to check it:

type quote

Its purpose is evidently clear.