войти зарегистрироваться

Linux для всех whois

индекс
181,26

Eще немного о ZSH

Вот прочитал эту статейку и решил поделиться своими заметками.

Все ниженаписаное было написано для себя дабы служить шпаргалкой, так что не судите строго :)
Начнемс…

Если у нас есть абсолютный путь к файлу, а нам нужно вывести имя файла или каталог в котором лежит файл можно воспользоваться конструкциями «:h» и «:t»:
$ e=`ls =cat`;print "Directory " $e:h "file " $e:t
Directory /bin file cat


Отделить имя файла от расширения тоже не доставит много труда:
$ filename=(image.png document.doc test.sh)
$ print -l $filename:r
image
document
test
$ print -l $filename:e 
png
doc
sh


Меняем регистр:
$ filename=$filename:u
$ print $filename
IMAGE.PNG DOCUMENT.DOC TEST.SH

$ filename=$filename:l
$ print $filename
image.png document.doc test.sh


Следующие несколько примеров нам помогут сплитить строки.
$ u="test"
$ print $u[1]
t

$ VAR="this is a big long sentence"
$ VAR[(w)5]
long
$ echo $VAR[(w)2,(w)5] 
is a big long
$ echo $VAR[(w)2,15]
is a big l


меняем сепаратор
$ VAR="this/is/a/long/string"
$ print $VAR[(ws./.)4]
long


Заменить набор символов в строке можно следующим образом:
$ VAR=`pwd`
$ print $VAR
/usr/share/doc
$ print ${(s./.)VAR}
usr share doc
$ print ${VAR:gs./.:.}
:usr:share:doc
или
$ print ${VAR:gs:/:.:}
.usr.share.doc


Если у нас в переменной находится многострочный текст, то вывести определенную строку можно как то так:
$ VAR=`head /etc/passwd`
$ print $VAR[(f)1]
root:x:0:0:root:/root:/bin/zsh


Некоторые полезные, для скриптов, конструкции(крайне полезно, когда нужно задать дефолтное значение):
${+VAR} #если переменная VAR существует возвращается 1 иначе 0
$ VAR=""
$ print ${+VAR}
1
$ print ${+AR} 
0

${VAR:-word} #Если переменная VAR существует и не равна "" то возвращается она же, иначе возвращается word.
$ print ${AR:-word}
word
$ print ${VAR:-word}
word
$ VAR="hello"
$ print ${VAR:-word}
hello

${VAR:+word} #Если переменная VAR существует и не равна "" то возвращается word, иначе ничего
$ VAR="test"
$ print ${VAR:+word}
word

${name#pattern}
${name##pattern} #Незнаю в чем различие но эФфект следующий: возвращается окончание строки за исключением начала которое совпадает с pattern:
$ VAR="hello world"
$ print ${VAR#hell}
o world

${name%pattern}
${name%%pattern} #тоже самое только возвращает начало
$ print ${VAR%%world}
hello 
$ print ${VAR%%ll*d}
he


Также стоит обратить особое внимание на typeset. Я пока что обратил внимание на «typeset -A variable» это позволит превратить нашу переменную variable в подобие словаря. Например:
$ typeset -A VAR
$ VAR=(1 test 5 pass 3 help 7 hello)
$ print $VAR[5]
pass
$ print $VAR[3]
help


если явно не указывать тип то присвоив таким образом значение переменной мы получим список:
$ VAR=(1 test 5 pass 3 help 7 hello)
$ print $VAR[4]
pass


если же мы значения запишем в кавычках то получим простую строку:
$ VAR='1 test 5 pass 3 help 7 hello'
$ print $VAR[4] 
e


Вот пожалуй и все. Более глубокое освоение осложняется плохим знанием(а лучше сказать незнанием) английского языка :(.

Некоторые полезные ресурсы:
  1. ZSH-LOVERS
  2. A User's Guide to the Z-Shell

комментарии (22)

  • Спасибо, добавил в избранное :)
  • Возьмём на вооружение
  • добрые хабралюди плюсанули по карме — решил перенести сюда.
  • А я бы в первом примере Folder на Directory поменял.

    Для идеологической верности :)
    • не проблема конечно, но это все же пример ;)
    • поправил
      • Спасибо.

        Пойду пока пока zsh поставлю :)
  • автор еретик? юзает zsh, а в приглашении $ от вражеского баша. не хорошо.

    • эм… всегда думал что "$" — символизирует юзера, а "#" — рута
      • не совсем так. "#" — рут. юзирское приглашение зависит от шелла.

        sh, bash — "$"
        zsh — "%"
        tcsh — ">"

        btw, zsh умеет автоматом менять данный знак в приглашении в зависимости от текущего уида, например после использования sudo, с % на # и потом обратно :)

        ps: шелл для реальне воене Корн (дефультный шелл в AIX'е, SunOS, Solaris и т. п. платных юнипсов), имеет как раз так же дефультный знак $, отсюда скорее всего и манера считать $ значком юзира.
        • госпаде, что за ублюдочное общество вокруг, никоим разом не способное принять критику и не насрать в ответ. буд-то кроме как реакции наполненой позитивными восхищениями никто не ожидает и только на этом тут и живут: «ты мне плюсик, ай маладца, а я тебе плюсик, ай маладца» — и оба довольные собой сидят и радуются что друг друга любят. йобанестыд. фу.
    • что в настройках будет, то и покажет.
      • из man zshparam:
        PS1
        The primary prompt string, printed before a command is read.
        the default is `%m%# '. It undergoes a special form of expan-
        sion before being displayed; see the section `Prompt Expansion'.

        а теперь ползем в zshrc и ставим дефультный %# и видим в приглашении % в случае юзира и # в случае рута.

        ну а так да, чо в конфиг накалякаем, то и будет. но только еретик будет рассказывать про шелл давая примеры в которых значок от вражьего шелла. другими словами, приглашение — единственное почему можно узнать шелл, а тут не понятно что и к чему. вот и все. хотя нормальный человек не будет читать чужие заметки, а почитает man'ы, которых в коробке с шеллом более чем достаточно. :)
        • Честно говоря, не вижу повода для отправления автора на костер. Разве баш настолько ужасен, что надо скрывать все что о нем напоминает?! Какая разница какой там значок?! Я честно говоря не знаю в своем кругу ни одного линуксоида со стандартным макетом приглашения, поголовно все пользуются цветовой дифференциацией штанов приглашений. А $ и # привычны по статьям.

          P.S. я вас не минусовал (:
          • имхо, если статья про шелл, который можно отличить по приглашению, то это самое приглашение должно быть дефультным. чтобы в отрыве от пояснялок, глядя на данные примеры было понятно что это за шелл. может это конечно странно, но по-мойму вполне логично.

            пс: да я понятие не имею кто кого минусует, потому что этот процесс не поддается логике :) рандомно все как-то Ж)
    • ему так удобно.
  • # print -l =ls(:h) =ls(:t)
    /bin
    ls
    #
  • автор не изучил до конца возможностей баша.
    многие вещи, описанные как плюсы zsh есть и в баше (zsh же это замена башу) или реализуются функциями в пару строк, добавлеными уже давно в .bashrc мудрыми людьми.
    • Автор до конца не изучил и zsh, и он никого не призывал использовать zsh вместо bash(а). Автор просто написал то что знает и считает удобным в использовании, в надежде что кому то это может пригодится, ну а если вы досконально изучили баш то я вас могу только поздравить.
    • чтож, обмен опытом штука хорошая. пусть фичи перетекают в обе стороны, я думаю хуже от этого не станет…
      • согласен, поэтому прочитал статью очень внимательно и добавил в избранное
    • Когда-то я тоже пытался перелезть на zsh, он привлекал многими фичами. Но потом все, что мне было нужно я нашел как реализовать в старом добром bash :-)
Только авторизованные пользователи могут оставлять комментарии. Авторизуйтесь, пожалуйста.