«Com.jacob.com.ComFailException: не удается найти прозвище» Почему?

Неперехватывающие символы новой строки не удаляются

Новые строки, которые вы ищете, есть, вы их просто не видите, потому что вы используете echo без цитирования переменной.

Валидация :

$ a=$( df -H )
$ echo $a
Filesystem Size Used Avail Use% Mounted on /dev/sda3 276G 50G 213G 19% / udev 2.1G 4.1k 2.1G 1% /dev tmpfs 832M 820k 832M 1% /run none 5.3M 0 5.3M 0% /run/lock none 2.1G 320k 2.1G 1% /run/shm
$ echo "$a"
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda3       276G   50G  213G  19% /
udev            2.1G  4.1k  2.1G   1% /dev
tmpfs           832M  820k  832M   1% /run
none            5.3M     0  5.3M   0% /run/lock
none            2.1G  320k  2.1G   1% /run/shm
$ 

Удалены новые строки

Так как @ user4815162342 правильно указал , хотя новые строки в выходе не удаляются, trailing newlines удаляются с заменой команды. См. Эксперимент ниже:

$ a=$'test\n\n'
$ echo "$a"
test


$ b=$(echo "$a")
$ echo "$b"
test
$

В большинстве случаев это не имеет значения, потому что echo добавит удаленную новую строку (если только она не вызывается с опцией -n), но есть некоторые краевые случаи где в выводе программы есть еще одна конечная новая строка, и по какой-то причине они значительны.

Методы обхода

1. Добавить фиктивный символ

В этом случае, как упоминалось в @Scrutinizer, вы можете использовать следующее обходное решение:

$ a=$(printf 'test\n\n'; printf x); a=${a%x}
$ echo "$a"
test


$ 

Объяснение: Символ x равен добавляется к выходу (используя printf x) после строк новой строки. Поскольку новые строки больше не trailing , они не удаляются подстановкой команд. Следующий шаг - удалить x, который мы добавили, используя оператор % в ${a%x}. Теперь у нас есть исходный вывод со всеми новыми символами !!!

2. Чтение с использованием подстановки процесса

Вместо того, чтобы использовать подстановку команд для назначения вывода программы переменной, мы можем вместо этого использовать подстановку процесса для подачи вывода программы на read встроенная команда (кредит для @ormaaj). Замена процесса сохраняет все новые строки. Чтение вывода в переменную несколько сложно, но вы можете сделать это следующим образом:

$ IFS= read -rd '' var < <( printf 'test\n\n' ) 
$ echo "$var"
test


$ 

Объяснение:

  • Мы установили внутренний разделитель полей для команды чтения с нулевым значением, с IFS=. В противном случае read не назначил весь вывод var, а только первый токен.
  • Мы вызываем read с параметрами -rd ''. r предназначен для того, чтобы предотвратить обратную косую черту в качестве специального символа, а с помощью d '' установить разделитель на ничего, чтобы чтение читало весь вывод, а не только первую строку.

3. Чтение из трубы

Вместо того, чтобы использовать команду или замену процесса для назначения вывода программы переменной, мы можем вместо этого передать вывод программы команде read (кредит @ormaaj). Трубопровод также сохраняет все новые строки. Обратите внимание, однако, что на этот раз мы установили необязательное поведение оболочки lastpipe, используя встроенный shopt . Это необходимо, так что команда read выполняется в текущей среде оболочки. В противном случае переменная будет назначена в подоболочке, и она не будет доступна из остальной части скрипта.

$ cat test.sh 
#!/bin/bash
shopt -s lastpipe
printf "test\n\n" | IFS= read -rd '' var
echo "$var"
$ ./test.sh 
test


$
1
задан Joachim Sauer 25 May 2010 в 11:50
поделиться

1 ответ

COM-объекты должны быть зарегистрированы, чтобы их можно было найти. Не имеет значения, в какой папке они находятся.

Позвоните по

regsvr32 mycomdll.dll

для dll.

2
ответ дан 3 September 2019 в 00:19
поделиться
Другие вопросы по тегам:

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