Одинарные левые кавычки означают замену команды: результат расширения `pidof transmission-gtk`
вывод от выполнения команды pidof transmission-gtk
. Альтернативный способ записать `pidof transmission-gtk`
$(pidof transmission-gtk)
, и тот альтернативный путь рекомендуется (он не имеет никаких оборотных сторон, и он избегает проблем, когда команда в одинарных левых кавычках сама содержит кавычки).
Двойные кавычки вокруг этого препятствуют тому, чтобы результат замены команды был разделен на отдельные слова и интерпретирован как подстановочные шаблоны. Если Вы только запускаете со сценариев оболочки, не волнуйтесь об этом, просто не забудьте всегда помещать двойные кавычки вокруг замен команды. То же идет для подстановок переменных, например, всегда пишите "$foo"
, никогда плоскость $foo
.
Этот отрывок, как записано не имеет никакого смысла: тест содержит отдельное слово, которое будет чем-то как =0
(если нет никакого выполнения transmission-gtk
процесс) или 1234=0
(если существует процесс соответствия), или 123 456=0
(отдельное слово в терминологии оболочки, даже если это, оказывается, содержит пространство). Отдельное слово в тесте всегда считают верным. Чтобы протестировать, равна ли строка другой строке, записать [ "string1" = "string2" ]
(должно быть пространство на каждой стороне скобок, и на каждой стороне оператора). Для тестирования на числовое равенство используйте -eq
оператор, например. [ 1 -eq 01 ]
верно.
Здесь, существует два эквивалентных способа протестировать, существует ли выполнение transmission-gtk
процесс:
Тест, пуст ли вывод:
if [ -z "$(pidof transmission-gtk)" ]; then …
Тест, ли статус возврата pidof
является ненулевым, указывая на отказ. Так как вывод команды не используется, перенаправьте его к /dev/null
(большая пустота).
if ! pidof transmission-gtk >/dev/null; then
Проверьте stat
вывод:
# stat .xsession-errors
File: ‘.xsession-errors’
Size: 839123 Blocks: 1648 IO Block: 4096 regular file
Device: 816h/2070d Inode: 3539028 Links: 1
Access: (0600/-rw-------) Uid: ( 1000/ lik) Gid: ( 1000/ lik)
Access: 2012-05-30 23:11:48.053999289 +0300
Modify: 2012-05-31 07:53:26.912690288 +0300
Change: 2012-05-31 07:53:26.912690288 +0300
Birth: -
r=4
w=2
x=1
в каждой группе. Ваш пример 6 (r+w=4+2) 4 (r=4) 4 (r=4).
Число режима полных полномочий является 4-разрядным восьмеричным числом, хотя большую часть времени, Вы только используете 3 младших значащих цифры. Сложите каждую группу в строке полномочий, беря r=4, w=2, x=1. Например:
421421421
-rwxr-xr--
\_/ -- r+w+x = 4+2+1 = 7
\_/ -- r+_+x = 4+0+1 = 5
\_/ -- r+_+_ = 4+0+0 = 4 => 0754
Теперь, иногда Вы будете видеть нечетный modestring как это:
-rwsr-xr-T
Четвертая цифра перегружается на x
биты в modestring. Если Вы видите букву кроме x
там, затем это означает, что один из этих "специальных" четырех-разрядных битов установлен, и если буква является нижним регистром, то x
поскольку то положение также установлено. Таким образом, перевод для этого:
4 2 1
421421421
-rwsr-xr-T
+ + + -- s+_+T = 4+0+1 = 5
\_/ -- r+w+s = 4+2+1 = 7 (s is lowercase, so 1)
\_/ -- r+_+x = 4+0+1 = 5
\_/ -- r+_+T = 4+0+0 = 4 (T is uppercase, so 0) => 05754
Стандартный UNIX способ показать, что число является восьмеричным, должен запустить его с нуля. GNU chmod
примет режим, который Вы даете ему, является восьмеричным так или иначе, но является самым безопасным предварительно ожидать нуль.
Наконец, если Вы видите a +
в конце modestring:
-rwxr-xr-x+
затем это означает, что файл расширил полномочия, и Вам будут нужны больше, чем chmod
. Изучите setfacl
и getfacl
команды, для начинающих.
Получите список файлов с их строковыми и шестнадцатеричными значениями разрешений. Ввод% N в конце, чтобы вывод можно было легко перенести в Excel.
stat -c "%A %a %N" *
-rw-r--r-- 644 `file2.txt'
-rw-r--r-- 644 `file3.txt'
-rw-r--r-- 644 `file4.txt'
-rw-r--r-- 644 `file.txt'
drwxr-xr-x 755 `hsperfdata_root'
-rw-r--r-- 644 `junk.txt'
drwx------ 700 `vmware-root'
Это найдет все файлы с определенным шестнадцатеричным разрешением.
find /tmp1 -user root -perm 644
Для всех параллельных файлов в каталоге
-bash-4.1$ chmod -R 640 *
Для всех файлов
-bash-4.1$ chmod 640 *
Разрешения — это просто строковое представление двоичного числа. 0
в основном представлено -
, остальные буквы.
Для базовых разрешений:
Преобразуйте все -
и заглавные буквы S
или T
в 0
, остальные должны представлять 1
.
Результирующее двоичное число, построенное таким образом, должно быть напечатано как восьмеричное :
$ a=-rw-r--r--
$ b=${a//[ST-]/0}
$ b=${b//[!0]/1}
$ printf '%04o\n' $((2#$b))
0644
В одну строку:
$ b=${a//[ST-]/0}; b=${b//[!0]/1}; printf '%04o\n' $((2#$b))
0644
Исправление ошибок и обнаружение остальных 3 битов 1000
, 2000
или 4000
требуют дополнительного кода:
#!/bin/bash
Say (){ printf '%s\n' "$@"; }
SayError(){ a=$1; shift; printf '%s\n' "$@" >&2; exit "$a"; }
e1="Permission strings should have 10 characters or less"
e2="Assuming first character is the file type"
e3="Permission strings must have at least 9 characters"
e4="Permission strings could only contain 'rwxsStT-'"
a=$1
((${#a}>10)) && SayError 1 "$e1"
((${#a}==10)) && { Say "$e2"; a=${a#?}; }
((${#a}<9)) && SayError 2 "$e3"
a=${a//[^rwxsStT-]}
((${#a}<9)) && SayError 3 "e4"
b=${a//[ST-]/0}; b=${b//[!0]/1}; c=0
[[ $a =~ [sS]......$ ]] && c=$((c|4))
[[ $a =~ [sS]...$ ]] && c=$((c|2))
[[ $a =~ [tT]$ ]] && c=$((c|1))
printf '%04o\n' "$((2#$b|c<<9))"
stat -c %a /path/to/file
волшебный прием, в котором Вы нуждаетесь. – fromnaboo 09.08.2012, 16:05