Вы хотите, чтобы ваша локальная оболочка расширялась $var1
, а удаленная оболочка расширялась$var2
:
var1=1
ssh -p 42 root@xxx /bin/bash << EOF # un-quoted/escaped
var2=2
echo $var1
echo \$var2
EOF
Предположим, что $file
— это имя или путь к одному файлу, который вы хотите подставить в вывод контрольной суммы.
pv "$file" | sha256sum | { IFS=' ' read sum junk && printf '%s %s\n' "$sum" "$file"; }
Последняя часть конвейера считывает контрольную сумму и все остальное sha256sum
, выводимое в первой строке, а затем выводит контрольную сумму, за которой следует исходное имя файла.
Обратите внимание, что использование sha256sum -b
на самом деле не требуется, поскольку эти инструменты не делают различий между двоичными и текстовыми файлами в Unix.
Поскольку вывод команды уже записывается в переменную, вы можете «Захватить и исправить» переменную (POSIXly, yes запускается через тире):
sha_output=$( pv -W "$file" | sha512sum -b)
sha_output="${sha_output%\*-} $file"
${...%\*-}
удалит конечный *-
, а затем добавятся пробел и имя файла. На самом деле режим -b
полезен только в ОС, которые отличают двоичный режим от текстового при доступе к файлу (, а именно только MS -DOS ). Таким образом, для shaXsum
опция -b
не нужна, а звездочка (*
)(, сигнализирующая о двоичном режиме ), станет пробелом (, сигнализирующим о текстовом режиме ).
Если вы не выполняете захват, но хотите распечатать результат, вы можете использовать:
$ printf '%s\n' "$(pv "$file" | sha256sum | sed 's/-$//')$file"
2a19f5852... a27971c67bdc18 linuxmint-19.2-cinnamon-64bit.iso
Или @Kusalananda ответ.
Все ответы одинаково верны, совместимы с POSIX и полезны.
Обратите внимание, что все вышеперечисленное не имитирует точное поведение shaXsum
в том смысле, что некоторые имена файлов (с новой строкой или косой чертой )заставят хэш-строку начинаться с обратной косой черты.
Еслиfile='wo\\rds'
(содержит обратную косую черту ), вывод будет:
$ sha256sum "$file"
\f6c94d35691b9c356f7e5072f94d23f127b168cf9b04f0f5b26e0cb1f6ef4414 wo\\rds
Обратите внимание, что строка начинается с обратной косой черты, а проблемные символы в имени файла экранируются обратной косой чертой.
Ваша команда не имитирует:
$ printf '%s\n' "$(pv "$file" | sha256sum | sed 's/-$//')$file"
f6c94d35691b9c356f7e5072f94d23f127b168cf9b04f0f5b26e0cb1f6ef4414 wo\rds