Отправляемая вами строка содержит следующее:
$x$
который расширяется bash как содержимое переменной $x
. Поскольку $x
пусто, $x$
заменяется на $
. Вы можете избежать расширения переменной, используя простые кавычки вместо двойных :
psql -d mydb -c 'CREATE FUNCTION f_showfile(myfile text) RETURNS text AS $x$ BEGIN RETURN pg_read_file(myfile, 0, 100000); END; $x$ LANGUAGE PLPGSQL SECURITY DEFINER;'
Открытая квадратная скобка, [
, представляет собой стандартный исполняемый файл, эквивалентный test
, который обеспечивает синтаксический сахар при написании сценариев оболочки (, т. е. "выглядит красиво")
fruit="banana"
if [ banana = "$fruit" ] # "[" really is an executable
then
echo "Yum, yum"
fi
Или
fruit="banana"
if test pear = "$fruit"
then
echo "Yum, yum"
fi
Они прямо эквивалентны.
На самом деле ваша оболочка, вероятно, реализует как [
, так и test
напрямую, поэтому, когда вы вызываете их, ваша оболочка выполняет команду, а не запускает для этого отдельный процесс. Опять же, никакой заметной разницы для вас, пользователь.