Это невозможно в linux / unix, основная группа - это четвертое поле файла / etc / passwd, которое имеет определенный формат:
username:*:userid:groupid:gecos:homedir:shell
Четвертое поле не позволяет список целых чисел.
Назначения вторичной группы находятся в / etc / group. Там можно перечислить пользователей в несколько групп.
Если вы можете отказаться от выходного имени файла, я думаю, что следующий способ является самым простым:
command='echo "hello!"'
(echo "$command"; eval "$command") >output.txt
Но если вам нужно напечатать имя файла, вы можете использовать следующее:
command='echo "hello!"'
(echo "$command >output.txt"; eval "$command") >output.txt
Вы можете ввести переменную для имени файла, чтобы убедиться, что оно одинаково в двух экземплярах:
output="output.txt"
command='echo "hello!"'
(echo "$command >$output"; eval "$command") >$output
Таким образом, вы избегаете риска появления разницы в напечатанном имени файла и фактическом имени файла.
В общих чертах, о которых вы просите, это невозможно.
Чтобы добиться этого с помощью дополнительных инструментов (, подобныхscript
(1 )), необходимо, чтобы эта программа, учитывая вашу оболочку, что в
command >foo
foo
— это имя файла, и создайте его. Кроме того, оболочка попытается создать его, так что конфликт уже есть. Кроме того, что, если программа будет печатать
command >foo
на терминал?
Изнутри оболочки процесс перенаправления чрезвычайно примитивен с точки зрения программирования (попробуйте найти лекцию по C, где они сами создают примитивную оболочку, это действительно удивительно ).
Если тебе это действительно нужно,вам придется взломать собственную оболочку, чтобы перехватить перенаправления и передать команду в целевой файл. Но, наверное, в деталях много неприятных моментов...
Вы также можете обрезать всю оболочку:
$ sh -i |& tee sh.log
sh-4.4$ hello
sh: hello: command not found
sh-4.4$ echo hi
hi
sh-4.4$ exit
-i
необходим, чтобы оболочка оставалась интерактивной, несмотря на то, что стандартный вывод не является терминалом. bash и zsh также поддерживают эту опцию. |&
каналы stdout и stderr; он работает с zsh и bash, но не с sh (, вам понадобится2>&1 |
). Конечно, вы также можете использовать &>
или 2>&1 >
, если хотите просто перенаправить в файл и ничего больше. В любом случае, sh.log
здесь содержит все.
$ cat sh.log
sh-4.4$ hello
sh: hello: command not found
sh-4.4$ echo hi
hi
sh-4.4$ exit
Здесь вам может понадобиться одна из двух вещей.
Использованиеtee
для получения результата echo
, отправленного на терминал, а также в файл:
$ echo 'hello!' | tee output
hello!
$ cat output
hello!
Использование script
для захвата всего терминального сеанса:
$ script
Script started, output file is typescript
$ echo 'hello!' >output
$ cat output
hello!
$ exit
Script done, output file is typescript
$ cat typescript
Script started on Sat Nov 10 15:15:06 2018
$ echo 'hello!' >output
$ cat output
hello!
$ exit
Script done on Sat Nov 10 15:15:37 2018
Если это не то, о чем вы просите, уточните свой вопрос.