Команда -Назначение линейной переменной и выполнение команды

Это использует один конвейер и кажется довольно быстрым, но имеет ограничение, заключающееся в том, что все файлы имеют одинаковый размер

dd if=/dev/urandom bs=1024 count=10240 | split -a 4 -b 1k - file.

Пояснение :Используйте dd для создания 10240 *1024 байт данных; разбить это на 10240 отдельных файлов по 1 КБ каждый (имена будут идти от 'file.aaaa' до 'file.zzzz')

1
08.01.2021, 19:19
1 ответ

Это стандартная функция. Вы можете установить переменную при запуске команды, и тогда переменная будет установлена ​​для команды. Это также работает в показанном вами примере foo='hello' echo $foo. Проблема в том, что вы тестируете неправильно. Когда вы запустите это:

foo='hello' echo $foo

Оболочка расширит переменную до запуска команды. Поскольку fooна самом деле не устанавливается при запуске, это становитсяecho (эхом ничего ). Вы можете увидеть это с помощьюset -x:

$ set -x
$ foo='hello' echo $foo
+ foo=hello
+ echo

Теперь сравните это с тем, что произойдет, если вы вместо этого используете небольшой скрипт, чтобы ваша оболочка не видела эту переменную:

$ cat ~/scripts/foo.sh
+ cat /home/terdon/scripts/foo.sh
#!/bin/bash

echo "The value of foo is:$foo"

Используйте это для отображения переменной, и вы получите:

$ foo='hello' ~/scripts/foo.sh
+ foo=hello
+ /home/terdon/scripts/foo.sh
hello

Вы можете сделать то же самое, если вы вызовете bash -cи заключите команду, которую вы ей даете, в одинарные кавычки, чтобы переменная была защищена и не расширялась вашей текущей оболочкой перед вызовомbash -c:

$ foo='hello' bash -c 'echo $foo'
hello

Хотя это не удается, потому что двойные кавычки означают, что $fooрасширяется до того, как bash -cего увидит:

$ foo='hello' bash -c "echo $foo"

$

Поведение описано в man bashв разделе «ОКРУЖАЮЩАЯ СРЕДА» :

.
   The environment for any simple command or  function  may  be  augmented
   temporarily  by  prefixing  it with parameter assignments, as described
   above in PARAMETERS.  These assignment statements affect only the envi‐
   ronment seen by that command.

Также подробно описано в руководстве:3.7.1 Расширение простой команды

3
18.03.2021, 22:37

Теги

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