Поведение стека каталогов (pushd и popd) в сценариях bash

То, что управляет разрешениями по умолчанию, известно как umask.

НО....

Это зависит от того, как был создан файл, потому что разные демоны могут быть настроены на использование разных значений по умолчанию umask. Таким образом, создание файла с помощью общего ресурса samba/cifs, или через sftp, или путем интерактивного входа в систему и использования touch, или создание нового файла путем сохранения в каком-либо текстовом редакторе, таком как viили joe, или что-то еще, все это может закончиться с разными разрешениями, даже если файлы созданы одним и тем же пользователем в одном и том же каталоге.

Точно так же существует право собственности на созданные файлы/каталоги. По умолчанию в системе, вероятно, владельцем является создающий пользователь, а группа является основной группой создающего пользователя. Но имейте в виду, что на это (могут влиять другие права доступа к файлам, то есть бит setgidв каталоге ), а также различные параметры конфигурации демона, такие как настройка umask.

0
11.12.2019, 18:28
2 ответа

Есть несколько простых экспериментов, которые вы можете провести, чтобы найти ответы на свои вопросы. Иногда лучший способ изучить новые инструменты — поиграть с ними.

If I poorly write a script that uses pushd /etc but I don't finish it with popd: Will /etc still be in the pushd+popd directory stack/in RAM after the Bash script has finished executing and Bash has terminated?

$ cd /tmp
$ echo 'pushd /etc' > experiment.sh
$ bash experiment.sh
/etc /tmp
$ pwd
/tmp
$

Выше, experiment.shэто плохо -написанный сценарий. Он использует pushdдля помещения текущего каталога в стек и переключается на /etc/, после чего завершает работу. После завершения сценария работающая оболочка все еще находилась в /tmp.

Also does the pushd+popd directory stack clear (like variables do) if I close the terminal emulator session (which should terminate the Bash shell process for that terminal emulator session) without manually clearing it with popd?

$ cd /tmp
$ pushd /etc
/etc /tmp
$ dirs
/etc /tmp
-- close terminal --
-- open new terminal --
$ dirs
~

Выше в одной оболочке мы используем pushd, чтобы поместить текущий каталог в стек каталогов, закрыть терминал, а затем открыть новый терминал. В новом терминале мы видим, что директория, которая была запушена ранее, отсутствует в стеке.

1
28.01.2020, 02:17

Стек каталогов, используемый командами pushdи popdв bash, является локальным для текущей оболочки. Это означает, что если вы не используете popdв скрипте, это не повлияет на стек каталогов вне скрипта.

Стек будет очищен, если вы закроете терминал (, так как оболочка завершает работу ).

Стек каталогов также пуст по умолчанию всякий раз, когда вы запускаете новую bashоболочку.

3
28.01.2020, 02:17

Теги

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