Для удобства оптимальный метод является комбинацией ответов jmtd и Faheem.
Используя ssh-agent
один означает что новый экземпляр ssh-agent
потребности, которые будут созданы для каждого нового терминала, Вы открываетесь. keychain
при инициализации попросит пароль для закрытого ключа (ключей) и сохранит его. Тем путем Ваш закрытый ключ защищен паролем, но Вы не должны будете вводить свой пароль много раз.
Дуга Wiki рекомендует инициализировать связку ключей от /etc/profile.d/
или Ваш профиль оболочки, такой как .bash_profile
или .bashrc
. Это имеет недостаток, в котором это инициализирует Вашу связку ключей, как только Вы открываете терминал.
Более гибкий подход должен объединиться keychain
с определенным tmux
сессия. Так, в .bash_profile
:
tsess=$(tmux ls 2>&1)
if [[ "${tsess%%:*}" = "secured" ]] &&
[[ -f $HOME/.keychain/$HOSTNAME-sh ]]; then
# start keychain
/usr/bin/keychain -Q -q --nogui ~/.ssh/id_rsa
. $HOME/.keychain/$HOSTNAME-sh
fi
... и затем это - просто случай запуска защищенного tmux
сессия как и при необходимости (запущенный от keybind):
#!/bin/bash
PID=$(pgrep tmux)
new="tmux -f $HOME/.tmux/conf new -s secured"
old="tmux attach -t secured -d"
if [[ -z "$SSH_AUTH_SOCK" ]]; then
eval `ssh-agent`
trap "kill $SSH_AGENT_PID" 0
fi
if [[ -z "$PID" ]]; then
urxvtc -title "SSH" -e sh -c "${new}"
else
urxvtc -title "SSH" -e sh -c "${old}"
fi
ssh-add
Теперь, Ваша связка ключей будет только инициализирована однажды при запуске этого конкретного tmux
сессия. Пока та сессия сохраняется, Вы сможете получить доступ к ним ssh
ключи и нажатие в Ваши удаленные репозитории.
В bash
можно использовать синтаксис
str=$'Hello World\n===========\n'
Одинарным кавычкам предшествует a $
новый синтаксис, который позволяет вставлять escape-последовательности в строки.
Также printf
встроенный позволяет сохранять получающийся вывод к переменной
printf -v str 'Hello World\n===========\n'
Оба решения не требуют подоболочки.
Если в следующем необходимо распечатать строку, необходимо использовать двойные кавычки, как в следующем примере:
echo "$str"
потому что при печати строки без кавычек новая строка преобразовывается в пробелы.
Можно поместить литеральные новые строки в одинарных кавычках (в любой оболочке Bourne/POSIX-style).
str='Hello World
===========
'
Для многострочной строки здесь документы часто удобны. Строка питается, как введено к команде.
mycommand <<'EOF'
Hello World
===========
EOF
Если Вы хотите сохранить строку в переменной, используйте cat
команда в замене команды. Символ (символы) новой строки в конце строки будет разделен заменой команды. Если Вы хотите сохранить заключительные новые строки, поместите стопор в конец и снимите его позже. В совместимых POSIX оболочках можно записать str=$(cat <<'EOF'); str=${str%a}
сопровождаемый heredoc надлежащим, но удар требует, чтобы heredoc появился перед закрывающей скобкой.
str=$(cat <<'EOF'
Hello World
===========
a
EOF
); str=${str%a}
В ksh, ударе и zsh, можно использовать $'…'
заключенная в кавычки форма для расширения Escape обратной косой черты в кавычках.
str=$'Hello World\n===========\n'
str=$(cat <<'EOF')
не работает как есть.. )
потребности, которые будут помещены в следующую строку после конца документа EOF
.. но несмотря на это, это теряет запаздывающую новую строку, должную Управлять Заменой.
– Peter.O
03.09.2011, 19:49
\n
экземпляры в bash
при получении здесь-документа в переменной рассмотреть IFS= read -r -d '' str <<'EOF'...
как альтернатива подходу стопора (см. мой ответ).
– mklement0
08.07.2014, 18:29
Вы используете "эхо"? Попробуйте "эхо-e".
echo -e "Hello World\n===========\n"
echo
автоматически добавит один, если Вы не указываете-n. (Однако основной главный удар вопроса, то, как получить эти новые строки в переменную).
– Peter.O
03.09.2011, 11:48
bash
, echo -e
действительно работает над OS X - поэтому echo
встроенный удар (а не внешний исполняемый файл) и что встроенный действительно поддерживает -e
. (Как встроенное, это должно работать над всеми платформами, на которых работает удар; несущественно, echo -e
работы в ksh
и zsh
также). В отличие от этого, однако, внешнее echo
утилита на OS X - /bin/echo
- действительно не поддерживает -e
.
– mklement0
08.07.2014, 17:54
необходимо сделать это этот путь:
STR=$(echo -ne "Hello World\n===========\n")
Обновление:
Поскольку Fred указал на это, этот способ, которым Вы освободите запаздывание "\n". Для присвоения переменной с расширенными последовательностями обратной косой черты сделайте:
STR=$'Hello World\n===========\n\n'
давайте протестируем его:
echo "[[$STR]]"
дает нам теперь:
[[Hello World
===========
]]
Отметьте, тот $'' отличается, чем $ "". Второе делает перевод согласно текущей локали. Поскольку deital видят раздел QUOTING в man bash
.
При необходимости в новых строках в сценарии много раз, Вы могли бы объявить глобальную переменную, содержащую новую строку. Тем путем можно использовать его в дважды заключенных в кавычки строках (переменные расширения).
NL=$'\n'
str="Hello World${NL} and here is a variable $PATH ===========${NL}"
Из всего обсуждения вот самый простой путь ко мне:
bash$ str="Hello World
==========="
bash$ echo "$str"
Hello World
===========
Команда эха должна использовать двойные кавычки.
] В дополнение к замечательным существующим ответам:[
] [] Если вы используете [] bash[
] и предпочитаете [] использование реальных новых строк для удобочитаемости[], [][] read[
][] является еще одним вариантом для [] захвата here-doc в переменной [], который (как и другие решения здесь) не требует использования под-оболочки. [
# Reads a here-doc, trimming leading and trailing whitespace.
# Use `IFS= read ...` to preserve it (the trailing \n, here).
read -r -d '' str <<'EOF' # Use `IFS= read ...` to preserve the trailing \n
Hello World
===========
EOF
]
[# Test: output the variable enclosed in "[...]", to show the value's boundaries.
$ echo "$str"
[Hello World
===========]
]
[][]-r[
] гарантирует, что []read[
] не будет интерпретировать вход (по умолчанию, он будет обрабатывать специальные обратные слеши, но это редко бывает необходимо). [
][]-d ''[
] устанавливает разделитель "записи" на пустую строку, заставляя []read[
] читать весь вход []whole[] сразу (а не только одну строку). [
] Обратите внимание, что оставляя []$IFS[
] (внутренний разделитель полей) по умолчанию, он не интерпретирует вход, []$' \t\n'[
] (пробел, табуляция, новая строка), любой [] ведущий и ведущий пробел обрезается[] от значения, присвоенного []$str[
], который включает в себя ведущую новую строку here-doc.[
].
(Заметим, что хотя тело here-doc начинается на строке [] после [] стартового разделителя ([]'EOF'[
] здесь), оно не содержит []не[] новой строки []ведущей[]). [
] Обычно это желаемое поведение, но если вы хотите, чтобы трейлинговая новая линия, используйте []IFS=читайте -r -d ''[
] вместо простого [] читайте -r -d ''[
], но обратите внимание, что [] любые [] ведущие и трейлинговые пробелы белого цвета затем сохраняются.[
].
(Обратите внимание, что подготовка []IFS= [
] непосредственно к команде [] read[
] означает, что назначение действует только во время выполнения этой команды, поэтому нет необходимости восстанавливать предыдущее значение. )[
]Использование here-doc также позволяет []опционально использовать отступ[] для задания многострочной строки для удобочитаемости:[
] [# Caveat: indentation must be actual *tab* characters - spaces won't work.
read -r -d '' str <<-'EOF' # NOTE: Only works if the indentation uses actual tab (\t) chars.
Hello World
===========
EOF
]
[# Output the variable enclosed in "[...]", to show the value's boundaries.
# Note how the leading tabs were stripped.
$ echo "$str"
[Hello World
===========]
]
[]Размещение []-[
] между []<<[
] и открывающим разделителем here-doc ([]'EOF'[
], здесь) приводит к тому, что ведущие символы табуляции удаляются из тела here-doc и даже закрывающего разделителя,
но обратите внимание, что эта [] работает только с символами []actual[] tab[], а не с пробелами, поэтому, если ваш редактор переводит нажатия клавиш табуляции в пробелы, то потребуется дополнительная работа.[
#!/bin/bash
result=""
foo="FOO"
bar="BAR"
result+=$(printf '%s' "$foo")$'\n'
result+=$(printf '%s' "$bar")$'\n'
echo "$result"
printf '%s' "$result"
вывод:
FOO
BAR
FOO
BAR
str=$'Hello World\n===========\n'
названный? подстановка переменных? – zengr 10.08.2013, 03:28zsh
иksh
; однако, это не совместимо POSIX. – mklement0 08.07.2014, 17:46