Есть ли способ видеть полномочия всех промежуточных каталогов пути..?

Не действительно возможно сохранить полную экранную сессию.

То, что можно сделать, должно создать надлежащее .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. Для меня это не стоило бы усилия, потому что я ценю чистую среду после перезагрузки, если я могу настроить окна по умолчанию для экрана.

8
07.11.2011, 12:40
5 ответов

Вот две остроты. Один 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
8
27.01.2020, 20:09
  • 1
    Спасибо за исправление, Gilles! Вы могли дать пример того, как globbing может испортить set -- без -f? Я попробовал каталогом a[bar] на том же уровне как каталоги ab, aa и ar, но не успешно выполнялся. (РЕДАКТИРОВАНИЕ: Преуспейте в том, чтобы перестать работать, который является. Я хочу знать, как это идет не так, как надо.) –  janmoesen 10.11.2011, 09:43

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, все же упоминание выше покажет только читаемые миром каталоги.

8
27.01.2020, 20:09
#!/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
1
27.01.2020, 20:09

Я не знаю о коротком способе сделать так. Для этой задачи я использую сценарий оболочки, можно найти полезным, также:

 #!/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
0
27.01.2020, 20:09
  • 1
    Ваш сценарий повредится на определенных путях со специальными символами. –  Chris Down 07.11.2011, 15:36
  • 2
    хорошо - добавил еще некоторые кавычки. Но для таких редких случаев и никаких изменений, внесенных во что-либо, я жил с этим. –  ktf 07.11.2011, 17:56
  • 3
    Было бы более просто усилить IFS для разделения на /, как janmoesen делает. –  Gilles 'SO- stop being evil' 08.11.2011, 01:24

Не так сложный, но это помогло бы Вам, я предполагаю.

find . -type d -exec ls -lrt {} \;
0
27.01.2020, 20:09

Теги

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