ssh игнорирует / избавляется от $ [duplicate]

Вот еще один вариант использования jQuery grep. Pass true в качестве третьего параметра, чтобы grep удалял элементы, соответствующие вашей функции.

users = $.grep(users, function(el, idx) {return el.field == "money"}, true)

Если вы уже используете jQuery, тогда не требуется прокладка, которая может быть полезна в отличие от использования Array.filter.

46
задан codeforester 28 February 2018 в 01:21
поделиться

3 ответа

Вам нужно только минимальное изменение; одинарная кавычка разделителя здесь-документа после <<.

cat <<'EOF' >> brightup.sh

или эквивалентно обратная косая черта-escape it:

cat <<\EOF >>brightup.sh

Без цитирования здесь документ будет подвергаться переменной замене , backticks будут оцениваться и т. д., как вы обнаружили.

Если вам нужно развернуть некоторые, но не все значения, вам необходимо индивидуально избежать тех, которые вы хотите предотвратить.

cat <<EOF >>brightup.sh
#!/bin/sh
# Created on $(date # : <<-- this will be evaluated before cat;)
echo "\$HOME will not be evaluated because it is backslash-escaped"
EOF

будет производить

#!/bin/sh
# Created on Fri Feb 16 11:00:18 UTC 2018
echo "$HOME will not be evaluated because it is backslash-escaped"

. Как предложено @fedorqui , вот соответствующий раздел из man bash:

Здесь Документы

Этот тип перенаправления инструктирует оболочку читать входные данные от текущего источника до тех пор, пока не появится строка, содержащая только разделитель (без конечных пробелов). Все строки, считываемые до этой точки, затем используются в качестве стандартного ввода для команды.

Формат здесь-документов:

      <<[-]word
              here-document
      delimiter

Нет расширения параметров, команда подстановка, арифметическое расширение или расширение пути по слову. Если какие-либо символы в слове цитируются, разделитель является результатом удаления цитаты в слове, а строки в этом документе не будут расширены. Если слово без кавычек, все строки этого документа подвергаются расширению параметров, подстановке команд и арифметическому расширению. В последнем случае последовательность символов \ игнорируется, а \ должна использоваться для цитирования символов \, $ и `.

75
ответ дан tripleee 15 August 2018 в 21:31
поделиться
  • 1
    Вау, спасибо! Вы спасатель жизни: D – UberNate 29 March 2014 в 05:52
  • 2
    Я вижу, что вы отметили . Как избежать переменных расширения heredoc? как дубликат этого. Никаких возражений, только то, что я бы включил ссылку на документы Bash, как и в моем (у которых только 13k-визитов получили почти 100 реп, поэтому, похоже, это очень полезно). – fedorqui 6 June 2018 в 09:57
  • 3
    @fedorqui Может быть, вы хотите фактически направить свой ответ на этот вопрос? Или мы можем переключить дублируемую маркировку, чтобы быть наоборот; Я просто посмотрел на вопрос, а не на результат. – tripleee 6 June 2018 в 10:08
  • 4
    Ммм, как насчет слияния с ними, имея этот вопрос в качестве целевого? Дублированный вопрос имеет хороший заголовок, только то, что он длинный. Тем не менее, это как-то вызвало довольно много внимания в последнее время (я получаю некоторые upvotes в месяц ). – fedorqui 6 June 2018 в 10:32
  • 5
    @fedorqui Мне нравится концепция слияния, но я никогда не видел, чтобы это происходило на практике; если я правильно понимаю ситуацию, моды просто не способны обрабатывать нетривиальные слияния, потому что трудности и сложности намного перевешивают преимущества. То, что я делал один или два раза, удаляет полезный и поддержанный ответ и перенаправляет его по другому вопросу, хотя я вряд ли рекомендую это обходное решение. – tripleee 6 June 2018 в 10:53

Это должно сработать, я только что проверил его, и он работал, как ожидалось: никакого расширения, замены или того, что произошло с вами.

cat <<< '
#!/bin/bash
curr=`cat /sys/class/backlight/intel_backlight/actual_brightness`
if [ $curr -lt 4477 ]; then
  curr=$((curr+406));
  echo $curr  > /sys/class/backlight/intel_backlight/brightness;
fi' > file # use overwrite mode so that you don't keep on appending the same script to that file over and over again, unless that's what you want. 

Использование следующего также работает.

cat <<< ' > file
 ... code ...'

Кроме того, стоит отметить, что при использовании heredocs, таких как << EOF, замена и расширение переменных и т. п. место. Итак, сделаем что-то вроде этого:

cat << EOF > file
cd "$HOME"
echo "$PWD" # echo the current path
EOF

всегда приведет к расширению переменных $HOME и $PWD. Поэтому, если ваш домашний каталог /home/foobar, а текущий путь - /home/foobar/bin, file будет выглядеть следующим образом:

cd "/home/foobar"
echo "/home/foobar/bin"

вместо ожидаемого:

cd "$HOME"
echo "$PWD"
8
ответ дан Alexej Magura 15 August 2018 в 21:31
поделиться
  • 1
    Здесь строка в одинарных кавычках, очевидно, не может содержать ни одной кавычки, которая может быть непозволительной проблемой. Здесь документы являются единственным разумным обходным решением, если у вас есть сценарий, который должен содержать как одиночные, так и двойные кавычки, хотя это, конечно, не случай с простым примером OP. Кроме того, тангенциально, здесь строки <<< доступны только начиная с Bash 3 и не переносятся на другие оболочки. – tripleee 26 June 2015 в 03:23
  • 2
    <<< также доступен в Zsh – Alexej Magura 13 October 2016 в 16:35
  • 3
    сегодня я узнал, что вы можете иметь имя файла сразу после открытия в heredoc. Спасибо @AlexejMagura! – chaseadamsio 4 January 2017 в 07:13

Или, используя маркеры EOF, вам нужно указать начальный маркер, чтобы расширение не выполнялось:

#-----v---v------
cat <<'EOF' >> brightup.sh
#!/bin/bash
curr=`cat /sys/class/backlight/intel_backlight/actual_brightness`
if [ $curr -lt 4477 ]; then
   curr=$((curr+406));
   echo $curr  > /sys/class/backlight/intel_backlight/brightness;
fi
EOF

IHTH

15
ответ дан shellter 15 August 2018 в 21:31
поделиться
  • 1
    Я бы отредактировал ваш пост, но чтобы быть в безопасности, не должно быть #! / Bin / bash, а не! / Bin / bash? – Matthew Hoggan 14 November 2015 в 00:52
  • 2
    @MatthewHoggan: Да, ты прав! Спасибо, что поймал это. Я исправляю это сейчас. – shellter 14 November 2015 в 02:11
Другие вопросы по тегам:

Похожие вопросы: