Замена завершающего текста POSIX-ly

Вы хотите, чтобы ваша локальная оболочка расширялась $var1, а удаленная оболочка расширялась$var2:

var1=1
ssh -p 42 root@xxx /bin/bash << EOF    # un-quoted/escaped
  var2=2
  echo $var1
  echo \$var2
EOF
0
01.12.2019, 10:42
2 ответа

Предположим, что $file— это имя или путь к одному файлу, который вы хотите подставить в вывод контрольной суммы.

pv "$file" | sha256sum | { IFS=' ' read sum junk && printf '%s  %s\n' "$sum" "$file"; }

Последняя часть конвейера считывает контрольную сумму и все остальное sha256sum, выводимое в первой строке, а затем выводит контрольную сумму, за которой следует исходное имя файла.

Обратите внимание, что использование sha256sum -bна самом деле не требуется, поскольку эти инструменты не делают различий между двоичными и текстовыми файлами в Unix.

2
28.01.2020, 02:21

Поскольку вывод команды уже записывается в переменную, вы можете «Захватить и исправить» переменную (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
1
28.01.2020, 02:21

Теги

Похожие вопросы