Смена группы в оболочке

Один момент. KSH по умолчанию не принимает клавиши со стрелками для перебора истории команд.

См. этот вопрос:

https://stackoverflow.com/questions/1623256/make-arrow-and-delete-keys-work-in-kornshell-command-line

Из ответа Тима:

Для клавиш со стрелками вы можете поместить это в свой файл .kshrc [( pdkshи mkshоба используют .mkshrc, а не .kshrc )] в вашем домашнем каталоге:

set -o emacs
alias __A=`echo "\020"`     # up arrow = ^p = back a command
alias __B=`echo "\016"`     # down arrow = ^n = down a command
alias __C=`echo "\006"`     # right arrow = ^f = forward a character
alias __D=`echo "\002"`     # left arrow = ^b = back a character
alias __H=`echo "\001"`     # home = ^a = start of line
alias __Y=`echo "\005"`     # end = ^e = end of line

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

echo "\020"

, чтобы получить символ управления-n, назначенный на __B.

РЕДАКТИРОВАТЬ (спасибо, mirabilos): я удалил материал с обратных кавычек во время поиска. Я был введен в заблуждение этим:

См. https://stackoverflow.com/questions/9449778/what-is-the-benefit-of-using-instead-of-backticks-in-shell-scripts

Убедитесь, что ваша переменная $HISTFILEenv указывает на файл, и все готово.

У меня есть pdksh, из справочной страницы :

ПРИМЕЧАНИЕ: если HISTFILE не установлен, файл истории не используется. Это отличается от исходной оболочки Korn, в которой используется $HOME/.sh_history; в будущем pdksh может также использовать файл истории по умолчанию.

Для mkshэто тот же:

Примечание: Если HISTFILE не установлен, файл истории не используется. Этот отличается от AT&T UNIX ksh.

Обратите внимание, что мой pdkshи мой mkshиспользуют $HOME/.mkshrcкак файл .kshrc. Опять же, вопрос о RTFM ( man ksh), ваша реализация может использовать другую. (спасибо Кусалананде за намек на это).

Кстати, вы можете легко преобразовать историю ksh в bash_history, используя команду stringsи sed для очистки следующим образом:

strings | sed 's/^[ \t]*//' >> $HOME/bash_history

0
09.09.2016, 11:14
3 ответа

Ни bash, ни zsh не имеют этой функции.

Вы можете вызвать newgrp . Это внешняя команда, запускающая новый процесс. Он запускает программу, указанную переменной среды SHELL , без аргументов.

newgrp common <<EOS
touch alpha beta
EOS
touch belongs_to_original_group

Обратите внимание, что поскольку newgrp запускает новую оболочку, она не наследуется от переменных оболочки исходной оболочки, а только от (экспортируемых) переменных среды. Выполненные здесь задания вступят в силу только там.

2
28.01.2020, 02:27

Для этого используйте команду newgrp :

newgrp common
touch whatever
newgrp foo

Поскольку вы являетесь членом обеих групп (и, вероятно, не использовали пароль для групп), вы сможете легко переключаться. Фактически каждый вызов newgrp создает подоболочку. Вы можете проверить, «кто» вы используете id . Выходите ли вы из оболочки (и возобновляете работу с предыдущей группой) или создаете новую подоболочку, зависит от того, что вы хотите сделать.

В отличие от некоторых связанных команд, эта находится в POSIX :

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

2
28.01.2020, 02:27

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

Предположим, что каталог имеет разрешения 2775 (скажем), который равен rwxrwsr-x и принадлежит xyz.common . Если пользователь, который является членом группы общий , создает файл или подкаталог в этом каталоге, то его групповое владение автоматически устанавливается на общее .

0
28.01.2020, 02:27

Теги

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