Не действительно возможно сохранить полную экранную сессию.
То, что можно сделать, должно создать надлежащее .screenrc
который установит некоторые вещи после перезапуска системы.
Вот некоторые комментарии к вещам, которые Вы перечислили:
Я использую что-то вроде этого в моем .screenrc
открыть некоторые определенные оболочки на запуске:
## set the default shell
shell zsh
# screens
screen -t 'zsh'
screen -t 'mutt' mutt
screen -t 'zsh' /home/user/bin/scriptToRun
[..]
Вы получите строку между '' как Ваше имя окна и команда после того, как имя будет выполняться на Вашей оболочке по умолчанию. Включайте любой сценарий, который Вы хотите, например, изменяете в определенном каталоге и открываете некоторые журналы.
Вы когда-либо думали о совместном использовании истории оболочек через Ваши сессии? По моему скромному мнению, это делает вещи намного более легче. В ZSH поконченный setopt SHARE_HISTORY
в Вашем .zshrc
Если Вы действительно нуждаетесь в этом и не хотите компромисса, Вы могли бы думать о сценарии оболочки, который считывает текущее состояние экрана, сохраняет количество оболочек, переменных среды, и т.д. и помещает эту информацию в сценарий запуска, названный Вашим .screenrc
. Для меня это не стоило бы усилия, потому что я ценю чистую среду после перезагрузки, если я могу настроить окна по умолчанию для экрана.
Вот две остроты. Один ls
вызов на компонент контура:
$ (IFS=/; set -f -- $PWD; for arg; do path="${path%/}/$arg"; ls -dal "$path"; done)
Вывод:
# drwxr-xr-x 31 root admin 1122 4 Nov 22:08 /
# drwxr-xr-x 9 root admin 306 3 Nov 17:36 /Users
# drwxr-xr-x+ 67 janmoesen staff 2278 7 Nov 14:46 /Users/janmoesen
# drwxr-xr-x+ 53 janmoesen staff 1802 4 Nov 22:07 /Users/janmoesen/Sites
# drwxr-xr-x 28 janmoesen staff 952 7 Nov 15:01 /Users/janmoesen/Sites/example.com
Со всего одним вызовом к ls
со всеми путями:
$ (IFS=/; set -f -- $PWD; for arg; do path="${path%/}/$arg"; paths+=("$path"); done; ls -dal "${paths[@]}")
Вывод:
# drwxr-xr-x 31 root admin 1122 4 Nov 22:08 /
# drwxr-xr-x 9 root admin 306 3 Nov 17:36 /Users
# drwxr-xr-x+ 67 janmoesen staff 2278 7 Nov 14:46 /Users/janmoesen
# drwxr-xr-x+ 53 janmoesen staff 1802 4 Nov 22:07 /Users/janmoesen/Sites
# drwxr-xr-x 28 janmoesen staff 952 7 Nov 15:01 /Users/janmoesen/Sites/example.com
Linux идет namei
команда, которая главным образом полезна для отображения символьных ссылок в путях, но может также показать владение.
$ namei -nom ~
f: /home/gilles
drwxr-xr-x root root /
drwxr-sr-x root staff home
drwxr-xr-x gilles gilles gilles
Иначе вот способ выполнить итерации по последовательным каталогам, содержащим данный файл (не единственный, поскольку другие ответы на этой странице иллюстрируют), и перечислите их содержание.
d=$PWD; set /;
while [ -n "$d" ]; do set -- "$@" "$d/"; d=${d%/*}; done;
ls -ld "$@"
Обратите внимание, что этот список может немного вводить в заблуждение в присутствии символьных ссылок. Например, если /foo/bar
символьная ссылка на /hello/world
который является самостоятельно символьной ссылкой на /one/two
, и весь из /foo
, /hello
и /world
читаемы миром (скажите режим 755), но /hello
не читаемо пользователю Alice, затем Alice не сможет достигнуть /foo/bar
, все же упоминание выше покажет только читаемые миром каталоги.
#!/bin/bash
(( $# )) || set -- "$PWD"
IFS='/'
for _arg; do
if ! [[ -e "${_arg}" ]]; then
printf '%s\n' "${_arg} does not exist!"
exit 1
fi
read -ra _dirs <<< "${_arg}"
(( _length = ${#_dirs[@]} + 1 ))
for (( _offset = 2 ; _offset < _length ; _offset++ )); do
_current_dir="${_dirs[*]::_offset}"
_perms=$(ls -ld "${_current_dir}" | awk '{ print $1" "$3" "$4 }')
printf '%s %s\n' "${_perms}" "${_current_dir}"
done
done
Я не знаю о коротком способе сделать так. Для этой задачи я использую сценарий оболочки, можно найти полезным, также:
#!/bin/ksh
if [ $# -eq 0 ]
then
set "$PWD"
fi
for path in "$@"
do
while true
do
ls -ld "$path"
if [ -z "$path" -o "$path" = . -o "$path" = / ]
then
break
fi
path=$(dirname "$path")
done
done
Править: Использование until
цикл опускает потребность в повреждении...
#!/bin/ksh
[ $# -eq 0 ] && set "$PWD"
for path
do
until test -z "$path" -o "$path" = . -o "$path" = /
do
ls -ld "$path"
path=$(dirname "$path")
done
done
IFS
для разделения на /
, как janmoesen делает.
– Gilles 'SO- stop being evil'
08.11.2011, 01:24
Не так сложный, но это помогло бы Вам, я предполагаю.
find . -type d -exec ls -lrt {} \;
set --
без-f
? Я попробовал каталогомa[bar]
на том же уровне как каталогиab
,aa
иar
, но не успешно выполнялся. (РЕДАКТИРОВАНИЕ: Преуспейте в том, чтобы перестать работать, который является. Я хочу знать, как это идет не так, как надо.) – janmoesen 10.11.2011, 09:43