В наши дни это становится очень распространенной проблемой, попробуйте это следующим образом:
ssh -t auser@something.com ssh -t aserver 'su - buser -c \"tail -f /logfile\"'
Один из способов такой:
$ A=$(<file)
Вместо переменной, лучшим вариантом будет чтение в массив, что облегчает доступ к разным строкам:
$ OIFS=$IFS
$ IFS=$'\n'
$ arr=($(<file))
$ IFS=$OIFS
Bash не поддерживает нулевые байты в переменных. foo=$(cat file)
заставляет $foo
содержать начало файла, вплоть до первого нулевого байта. Замена команды также удаляет из файла все конечные новые строки. Например, если файл состоит из четырех байт (a
, новая строка, новая строка, новая строка), то foo
содержит только a
, как если бы файл содержал только этот один байт.
Если вы хотите сохранить конечные новые строки, сделайте так, чтобы команда выводила дополнительный символ без новой строки, а затем удалите его.
foo=$(cat file; echo a)
foo=${foo%a}
До сих пор все это работало во всех оболочках в стиле Bourne/POSIX (ash, ksh, bash, ...). Bash ≥4.0 имеет более быстрый способ чтения файла в переменную: mapfile
.
mapfile <file foo
Просто не существует способа запихнуть нулевой байт в переменную bash. Если вам это нужно, у вас есть несколько вариантов:
base64
и base64 -d
.