В сценарии оболочки ...
Как мне захватить стандартный ввод переменной, не убирая завершающие символы новой строки?
Прямо сейчас я попробовал:
var=`cat`
var=`tee`
var=$(tee)
Во всех случаях $var
не будет завершающей новой строки входного потока. Спасибо.
ТАКЖЕ: Если на входе нет завершающего символа новой строки, то решение не должно добавлять его .
ОБНОВЛЕНИЕ В СВЕТЕ ПРИНЯТОГО ОТВЕТА:
Окончательное решение, которое я использовал в своем коде, выглядит следующим образом:
function filter() {
#do lots of sed operations
#see https://github.com/gistya/expandr for full code
}
GIT_INPUT=`cat; echo x`
FILTERED_OUTPUT=$(printf '%s' "$GIT_INPUT" | filter)
FILTERED_OUTPUT=${FILTERED_OUTPUT%x}
printf '%s' "$FILTERED_OUTPUT"
Если вы хотите увидеть полный код, перейдите на страницу github для расширителя , небольшого сценария оболочки с открытым исходным кодом для фильтра ключевых слов git, который я разработал для целей информационной безопасности. В соответствии с правилами, установленными в файлах .gitattributes (которые могут быть специфичными для отрасли) и git config , git направляет каждый файл через сценарий оболочки expandr.sh при каждом входе или выходе из репозитория. (Вот почему было важно сохранить любые завершающие символы новой строки или их отсутствие.) Это позволяет очищать конфиденциальную информацию и менять местами различные наборы специфических для среды значений для тестовой, промежуточной и активной веток.
filter
, то он добавит символы новой строки к концам любых входных потоков, которые изначально не заканчивались символами новой строки. На самом деле я изначально только что сделал, filter
но столкнулся с той проблемой, которая привела меня к этому решению, потому что ни «всегда добавлять новые строки», ни «всегда удалять новые строки» не являются приемлемыми решениями.
sed
вероятно, будет делать дополнительную новую строку - но вы должны справиться с этим filter
не со всеми остальными. И все те функции, которые у вас есть, в основном делают одно и то же - а sed s///
. Вы используете оболочку для данных труб это сохраненное в памяти , sed
так что sed
может заменить эти данные с другими данными , что оболочка , хранящиеся в его памяти , поэтому sed
можно перенаправить его обратно к корпусу. Почему не просто [ "$var" = "$condition" ] && var=new_value
? Я также не получаю массивы - вы сохраняете имя массива, а [0]
затем используете sed
для замены его значением в [1]
? Может быть, чат?
filter
? Работает отлично как есть. Относительно того, как работает код по моей ссылке и почему я настроил его так, как я это сделал, да, давайте поговорим об этом в чате.
filter
беретstdin
- бежитsed
. Вы ловитеstdin
в$GIT_INPUT
распечатайте его обратно вstdout
течение трубы кfilter
и поймать егоstdout
в систему,$FILTERED_OUTPUT
а затем распечатать его обратноstdout
. Все 4 линии в нижней части вашего примера выше можно было бы заменить только это:filter
. Здесь не обидно, просто ... ты слишком усердно работаешь. Вам не нужны переменные оболочки большую часть времени - просто направьте ввод в нужное место и передайте его дальше.