откуда $ PATH получает свои значения из (osx)?

Попробуйте:

#! /bin/bash
export maxlen=0

findmaxr()
{
        if [ $# -eq  0 ] ; then
        echo "Please pass arguments. Usage: findmax dir"
        exit 1
        fi

        if [ ! -d "$1" ];       then
        echo "No such directory exist."
        exit 2
        fi

        for file in "$1"/*
                do
                if [ -d "$file" ] ; then
                        findmaxr "$file"   # Recursively call the method for subdirectories
                else
                        f=${file##*/}
                        cur=${#f}
                        if [ $maxlen -lt $cur ] ; then
                                maxlen=$cur
                        fi
                fi
                done
}

findmaxr "$PWD"
echo "The file with the longest name has [$maxlen] characters."

Обсуждение

Не делайте этого:

for file in $(/bin/ls $1)

Даже если нет файла имя содержит пробелы, синтаксический анализ ls по-прежнему ненадежен.

Напротив, это будет работать надежно:

for file in "$1"/*

Кроме того, эта форма сохранит имена родительских каталогов, которые вам нужно перейти в подкаталоги. Например, используя структуру каталогов в приведенном ниже примере, вывод ls показывает только голые имена файлов для каталога d 1 :

$ ls 'd 1'
12345  d 2

Напротив, вывод 'd 1' / * включает имена родительского каталога в вывод:

$ echo 'd 1'/*
d 1/12345 d 1/d 2

Именно сохраняя имена родительских каталогов, мы заставляем рекурсию работать.

Поскольку файл теперь содержит полный путь, нам нужно удалить имена каталогов, прежде чем мы определим его длину.Это делается путем удаления префикса:

f=${file##*/}

Пример

Рассмотрим эту файловую структуру:

$ find .
.
./d 1
./d 1/12345
./d 1/d 2
./d 1/d 2/1234567
./d 1/d 2/d 3
./d 1/d 2/d 3/123456789
./script

Теперь давайте запустим наш скрипт:

$ bash script 
The file with the longest name has [9] characters.
2
22.07.2017, 23:00
2 ответа

Программа с именем path_helperпо умолчанию запускается из различных /etc/*rc-файлов оболочки.

$ grep path_helper /etc/* 2>/dev/null
/etc/csh.login:#if ( -x /usr/libexec/path_helper ) then
/etc/csh.login:#    eval `/usr/libexec/path_helper -c`
/etc/profile:#if [ -x /usr/libexec/path_helper ]; then
/etc/profile:#  eval `/usr/libexec/path_helper -s`
/etc/zprofile:#if [ -x /usr/libexec/path_helper ]; then
/etc/zprofile:# eval `/usr/libexec/path_helper -s`
$ 

Это, очевидно, не значение по умолчанию; Я отключил path_helperи управляю PATHв своих собственных файлах rc.

1
27.01.2020, 22:09

Когда вы входите в свой компьютер, loginwindow.app настраивает базовую среду, которая включает $HOME, $SHELL, $TMPDIR, $LOGNAME, $USERи $PATH.Среда также может быть изменена запускающими демонами или агентами. Или расширив переменную PATH в launchd. Обычно переменная PATH устанавливается равной жестко запрограммированной переменной PATH в ядре.

sysctl user.cs_path
user.cs_path: /usr/bin:/bin:/usr/sbin:/sbin

Когда вы запускаете эмулятор терминала, по умолчанию он вызывает login-login -pf <yourname>, который устанавливает только те переменные среды, которые еще не установлены (, см.man login).

Затем ваша оболочка-$SHELLчитает соответствующий файл в /etc, который вызывает path_helper. path_helperберет уже установленную переменную PATH, считывает /etc/paths, удаляет дубликаты в текущей переменной PATH и упорядочивает переменную PATH, как установлено в /etc/paths, затем считывает файлы в пределах /etc/paths.d, добавляет их в переменную PATH, а затем добавляет любые пути, которые были в исходном PATH, которые еще не были добавлены..

Наконец, ваш $SHELL считывает соответствующий rc-файл для оболочки входа в систему в вашем домашнем каталоге.

2
27.01.2020, 22:09

Теги

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