Перенаправить в файл, включая текущую строку подсказки

Это невозможно в linux / unix, основная группа - это четвертое поле файла / etc / passwd, которое имеет определенный формат:

username:*:userid:groupid:gecos:homedir:shell

Четвертое поле не позволяет список целых чисел.

Назначения вторичной группы находятся в / etc / group. Там можно перечислить пользователей в несколько групп.

4
10.11.2018, 16:43
4 ответа

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

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

Таким образом, вы избегаете риска появления разницы в напечатанном имени файла и фактическом имени файла.

2
27.01.2020, 20:44

В общих чертах, о которых вы просите, это невозможно.

Чтобы добиться этого с помощью дополнительных инструментов (, подобныхscript(1 )), необходимо, чтобы эта программа, учитывая вашу оболочку, что в

command >foo

foo— это имя файла, и создайте его. Кроме того, оболочка попытается создать его, так что конфликт уже есть. Кроме того, что, если программа будет печатать

command >foo

на терминал?

Изнутри оболочки процесс перенаправления чрезвычайно примитивен с точки зрения программирования (попробуйте найти лекцию по C, где они сами создают примитивную оболочку, это действительно удивительно ).

Если тебе это действительно нужно,вам придется взломать собственную оболочку, чтобы перехватить перенаправления и передать команду в целевой файл. Но, наверное, в деталях много неприятных моментов...

5
27.01.2020, 20:44

Вы также можете обрезать всю оболочку:

$ 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
5
27.01.2020, 20:44

Здесь вам может понадобиться одна из двух вещей.

  1. Использованиеteeдля получения результата echo, отправленного на терминал, а также в файл:

    $ echo 'hello!' | tee output
    hello!
    $ cat output
    hello!
    
  2. Использование 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
    

Если это не то, о чем вы просите, уточните свой вопрос.

12
27.01.2020, 20:44

Теги

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