А вот почему. Напишем скрипт:

#!/bin/bash
STR=""
for ITEM in a b c; do
  STR="$STR --param='$ITEM'"
done
echo $STR

И выполним его:

$ ./suka
--param='a' --param='b' --param='c'

Нормально? Всё нормально? Ну конечно же всё нормально, всё как и должно быть.
А теперь посмотрим ЧТО ТАМ НА САМОМ ДЕЛЕ БЛЯДЬ СУКА ЁБАНЫЙ В РОТ ПРОИСХОДИТ:

#!/bin/bash
STR=""
for ITEM in a b c; do
  STR="$STR --param='$ITEM'"
done
set -o xtrace
echo $STR
$ ./suka
+ echo '--param='\''a'\''' '--param='\''b'\''' '--param='\''c'\'''
--param='a' --param='b' --param='c'

ОП, БЛЯДЬ. А ЧТО ЖЕ ЭТО У НАС ЗА ОДИНАРНЫЕ КАВЫЧЕЧКИ, ЗАКЛЮЧЕННЫЕ В ОДИНАРНЫЕ КАВЫЧЕЧКИ ПОВЫЛЕЗАЛИ? А ЭТО КАКАЯ-ТО ТУПАЯ СУКА РЕШИЛА ЧТО РАЗ ВНУТРИ ПЕРЕМЕННОЙ ОДИНАРНЫЕ КАВЫЧЕЧКИ, ТО ОБЯЗАТЕЛЬНО НЕОБХОДИМО И ВОКРУГ ЗНАЧЕНИЯ ОДИНАРНЫХ КАВЫЧЕК ПОНАХУЯЧИТЬ И ВСЁ ЭТО ПОТОМ ЕЩЁ СУКА ЗАЭСКЕЙПИТЬ. А Я ТЕБЯ СУКА ОБ ЭТОМ НЕ ПРОСИЛ БЛЯДЬ! Я В ГРОБУ В БЕЛЫХ ТАПКАХ ТВОИ КАВЫЧКИ ЁБАНЫЕ ВИДЕЛ! Я УЖЕ ВСЁ ЧТО МНЕ НАДО ЗАЭКРАНИРОВАЛ, ЁБАНАЯ ТЫ ДРЯНЬ. КАКОГО ХУЯ? ДОКОЛЕ?

Да, это прокатывает с echo. А вот с rsync это говно уже не прокатывает, rsync вас нахуй с вашими одинарными кавычками пошлёт. И когда вы это будете всё дебажить, хуя с два вы сразу увидите и разберётесь почему rsync игнорирует ёбаные ключи. А всё потому, что если у vi есть два режима - бибикать и всё портить, то у bash их как минимум три - бибикать, всё портить и срать сука кавычками вокруг и внутри переменных при их выводе. А знаете как сделать ВОРКЭРАУНД блэт? А НИКАК! НИКАК ЕГО СУКА НЕ СДЕЛАТЬ, ПОТОМУЧТО ЛЮБЫЕ ПОПЫТКИ ДОБАВИТЬ КАВЫЧКИ СРАЗУ ВЫЗОВУТ ЭТУ КАВЫЧЕЧНУЮ ТУГОСЕРЮ

#!/bin/bash
STR=()
for ITEM in a b c; do
  STR+=(--param="$ITEM")
done
set -o xtrace
echo ${STR[@]}

Как видно выше, нам нужно сделать всё через жопу и потом молиться чтобы ТУГОСЕРЯ в нужный момент добавила кавычек туда, где они требуются. И конечно с усложнением кода всё это вызовет новый виток ебанизма и дегенерастии и ваш код на bash НИКОГДА. НИКОГДА СУКА БЛЯДЬ не будет работать так, как написано. Потомучто написано одно, а происходит блядь совершенно другое. И потом, как всегда, ОКАЗЫВАЕТСЯ, что когда ты блядь пишешь a = b + c то ВЫЯСНЯЕТСЯ что интерпретируется это как a = '''"""""" ++ ++ +-- + --+ **///- +b (c^435345) НУ КАНЕШНО РАЗВЕ МОГЛО БЫТЬ ИНАЧЕ

Вот такой вот сука блядь новый год. А потом ещё набегают толпы ебанутых, которые кричат ну это ты сам виноват, ты языка не знаешь. Да засуньте себе в жопу этот язык. Мне ПРИХОДИТСЯ им пользоваться, я ВЫНУЖДЕН блядь, потомучто он на каждой ёбаной машине как дефолтная среда установлен и это сука блядь НИКОГДА не изменится. И это вообще не язык, это ебучая среда, языком это назвать язык не поворачивается. Выход из семи, блядь.

[ ]
 

ВЫХОД ИЗ СЕМИ ПОТОМУЧТО BASH НЕ УМЕЕТ В АМПЕРСАНДЫ БЕЗ КАВЫЧЕК

curl -L "http://говно-с-амперсандами.рф/?a=b&ya_isporchu_tvou_zjizn=true&&&&&&&&&&&&&&&"
curl -L http://говно-с-амперсандами.рф/?a=b&ya_isporchu_tvou_zjizn=true&&&&&&&&&&&&&&&

ВЫЙДИ ИЗ СЕМИ
ВЫЙДИ ИЗ СЕМИ БЛЯДЬ СУКА
КАК ВЫВЕСТИ МЕНЯ ИЗ СЕМИ СУКА БЛДь руководство/пособие

GG

GG() # Case-insensitive, Wildcards disabled
{
  local SEARCH_STRING
  if [[ "$*" == "" ]]; then
    read -p "Type a search string: " SEARCH_STRING # Because bash is shit!
    history -s GG "'"${SEARCH_STRING//\'/\'\"\'\"\'}"'" # Shit!
  else
    SEARCH_STRING="$*"
  fi
  grep -RFIn --color=always "$SEARCH_STRING" . | cut -c1-1000
}
function perl_regex 
{ 
  local STR=${2:-'$_'}
  STR=${STR/'"'/'\"'}
  STR=${STR/'$0'/'$_'}
  perl -lne "/$1/ and print \"$STR\"";
}
[ ]
 

bashisms

1. Regular files: --usefile /path/to/file
2. Bashisms: --usefile <(cat <<< '{password:"12345"}')
   (ps output will show --usefile /dev/fd/XX)
   (don't use `echo "password"` as it will be shown in ps)
[ ]
 

Кавычечки. Кавычечки. Вместо одинарных случайно поставил двойные, автозаменой. Кавычечки он не любит. Пиздец.

Было:

#!/bin/bash
###
NODE_VERSION=">=0.11.13"
if [ -z $(which node) ]; then echo "ERROR: NODE.JS NOT FOUND"; exit 1; fi
if [ -z $(which coffee) ]; then echo "ERROR: COFFEESCRIPT NOT FOUND"; exit 1; fi
if [ "$(node -p "require('semver').satisfies(process.version,'$NODE_VERSION')")" != "true" ]; then echo "ERROR: INCOMPATIBLE NODE VERSION"; exit 1; fi
echo "Starting Coffee"; node --harmony $(which coffee) "$0" -- "$@"
exit
###
console.log "pizdos..."
console.log process.argv

Стало:

#!/bin/bash
###
NODE_VERSION=\>=0.11.13
if [ -z $(which node) ]; then echo ERROR: NODE.JS NOT FOUND; exit 1; fi
if [ -z $(which coffee) ]; then echo ERROR: COFFEESCRIPT NOT FOUND; exit 1; fi
if [ $(node -p require\(\'semver\'\).satisfies\(process.version,\'$NODE_VERSION\'\)) != true ]; then echo ERROR: INCOMPATIBLE NODE VERSION; exit 1; fi
echo Starting Coffee; node --harmony $(which coffee) $0 -- $@
exit
###
console.log "pizdos..."
console.log process.argv

ТЕПЕРЬ БОЛЬШЕ НИКАКИХ вложенных КАВЫЧЕЧЕК БЛЯДЬ! КОКАЯ КРОСОТА! МОЖНО ТЕПЕРЬ И ПОРАБОТАТЬ, НО ЧТО-ТО НЕ ХОЧЕТСЯ.
А вот ну совсем-совсем без кавычечек:

#!/bin/bash
###
NODE_VERSION=\>=0.11.13
if [ -z $(which node) ]; then echo ERROR: NODE.JS NOT FOUND; exit 1; fi
if [ -z $(which coffee) ]; then echo ERROR: COFFEESCRIPT NOT FOUND; exit 1; fi
if [ $(node -p require\(String\(/semver/\).substring\(1,7\)\).satisfies\(process.version,String\(/$NODE_VERSION/\).substring\(1\).slice\(0,-1\)\)) != true ]; then echo ERROR: INCOMPATIBLE NODE VERSION; exit 1; fi
echo Starting Coffee; node --harmony $(which coffee) $0 -- $@
exit
###
console.log "pizdos..."
console.log process.argv

МЕНЬШЕ КАВЫЧЕК БОБУ НЕКАВЫЧКИНУ

[ ]
 

alias hg='history|grep'
[ ]
 

Ошибка:

На сервере установлен nvm, при подключении через ssh он не загружается.

Причины:

При входе через ssh вместо .bashrc всегда запускается .bash_profile, а загрузчик nvm прописывается себя в .bashrc

Решение:

Создать на сервере файл ~/.bash_profile с командой загрузки bashrc:

if [ -f ~/.bashrc ]; then
  . ~/.bashrc
fi

Дополнительно:

Эта параша может продолжать писать, что node not found, в этом случае надо сделать живительный nvm use default

[ ]
 
[[ -s /home/$(whoami)/.nvm/nvm.sh ]] && . /home/$(whoami)/.nvm/nvm.sh
[ ]