Как правильно добавить путь к ПУТИ?

Я не уверен, достаточно ли это для Вас, но Вы могли бы использовать column программа и считала выбранные части использования файла head и/или tail как это:

 head -n 300 myfile.csv | tail -n 100 | column -ts ',' | less
 head -n-300 myfile.csv | head -n 100 | column -ts ',' | less

Вы могли обернуть его в некотором сценарии для просмотра различных частей файла за один раз (вероятно, без less затем). Кроме этого, я боюсь, что это была бы проблема для использования только инструментов GNU для задания.

957
17.09.2015, 21:27
9 ответов

Простой материал

PATH=$PATH:~/opt/bin

или

PATH=~/opt/bin:$PATH

в зависимости от того, хотите ли Вы добавить ~/opt/bin в конце (чтобы искаться после всех других каталогов, в случае, если существует программа тем же именем в нескольких каталогах), или вначале (чтобы искаться перед всеми другими каталогами).

Можно добавить многократные въезды одновременно. PATH=$PATH:~/opt/bin:~/opt/node/bin или вариации на упорядочивание работают просто великолепно. Не помещать export в начале строки, поскольку это имеет дополнительные сложности (см. ниже в соответствии с “Примечаниями по оболочкам кроме удара”).

Если Ваш PATH создается многими различными компонентами, Вы могли бы закончить с дублирующимися записями. Посмотрите, Как добавить путь корневого каталога, который будет обнаружен Unix, которые управляют? и Удалите дублирующиеся записи $PATH с командой awk, чтобы не добавить дубликаты или удалять их.

Автоматически помещаются некоторые дистрибутивы ~/bin в Вашем ПУТИ, если это существует, между прочим.

Куда поместить его

Поместите строку для изменения PATH в ~/.profile, или в ~/.bash_profile если это - то, что Вы имеете.

Отметьте это ~/.bash_rc не читается никакой программой, и ~/.bashrc конфигурационный файл интерактивных экземпляров удара. Вы не должны определять переменные среды в ~/.bashrc. Правильное место для определения переменных среды такой как PATH ~/.profile (или ~/.bash_profile если Вы не заботитесь об оболочках кроме удара). Посмотрите то, Что различие между ними и какой я должен использовать?

Не вставляйте его /etc/environment или ~/.pam_environment: это не файлы оболочки, Вы не можете использовать замены как $PATH там. В этих файлах можно только переопределить переменную, не добавляют к нему.

Потенциальные сложности в некоторых системных сценариях

Вам не нужно export если переменная уже находится в среде: любое изменение значения переменной отражается в среде. ¹ PATH находится в значительной степени всегда в среде; все системы Unix устанавливают его очень вначале (обычно в самом первом процессе, на самом деле).

Во время входа в систему можно полагаться PATH нахождение уже в среде, и уже содержащий некоторые системные каталоги. Если Вы пишете сценарий, который может быть выполнен рано при установке некоторой виртуальной среды, Вы, возможно, должны гарантировать это PATH непусто и экспортирован: если PATH все еще сброшен, затем что-то как PATH=$PATH:/some/directory установил бы PATH кому: :/some/directory, и пустой компонент вначале означает текущий каталог (как .:/some/directory).

if [ -z "${PATH-}" ]; then export PATH=/usr/local/bin:/usr/bin:/bin; fi

Примечания по оболочкам кроме удара

В ударе, ksh и zsh, export специальный синтаксис и оба PATH=~/opt/bin:$PATH и export PATH=~/opt/bin:$PATH сделайте правильную вещь даже. В других оболочках Bourne/POSIX-style, таких как тире (который является /bin/sh во многих системах), export анализируется как обычная команда, которая подразумевает два различия:

Таким образом в оболочках как тире, export PATH=~/opt/bin:$PATH наборы PATH к литеральной строке ~/opt/bin/: сопровождаемый значением PATH до первого пространства. PATH=~/opt/bin:$PATH (пустое присвоение), не требует кавычек и делает правильную вещь. Если Вы хотите использовать export в портативном сценарии необходимо записать export PATH="$HOME/opt/bin:$PATH", или PATH=~/opt/bin:$PATH; export PATH (или PATH=$HOME/opt/bin:$PATH; export PATH для мобильности даже к Оболочке Bourne, которая не приняла export var=value и не сделал расширения тильды).

¹ Это не было верно в Оболочках Bourne (как в фактической Оболочке Bourne, не современных оболочках стиля POSIX), но Вы очень вряд ли встретитесь с такими старыми оболочками в эти дни.

1070
27.01.2020, 19:27

Так или иначе работы, но они не делают того же самого: элементы PATHпроверяются слева направо. В Вашем первом примере, исполняемых файлах в ~/opt/bin будет иметь приоритет по установленным, например, в /usr/bin, который может или не может быть тем, что Вы хотите.

В частности, с точки зрения безопасности опасно добавить пути к передней стороне, потому что, если кто-то может получить доступ для записи к Вашему ~/opt/bin, они могут поместить, например, другое ls там, который Вы затем, вероятно, использовали бы вместо /bin/ls без того, чтобы замечать. Теперь вообразите то же для ssh или Ваш браузер или выбор... (То же идет трижды для помещения. в Вашем пути.)

86
27.01.2020, 19:27
  • 1
    Но если Вы хотите иметь свою собственную, настроенную версию ls, необходимо поместить его в каталог перед /bin. –  Barmar 17.09.2015, 23:20
  • 2
    или ls=myls –  waltinator 18.09.2015, 04:27

Я смущен вопросом 2 (так как удаленный из вопроса, так как это происходило из-за несвязанной проблемы):

Что осуществимый путь состоит в том, чтобы добавить больше путей на различных строках? Первоначально я думал, что это могло добиться цели:

export PATH=$PATH:~/opt/bin
export PATH=$PATH:~/opt/node/bin

но это не делает, потому что второе присвоение не только добавляет ~/opt/node/bin, но также и целое PATH ранее присвоенный.

Это - возможное обходное решение:

export PATH=$PATH:~/opt/bin:~/opt/node/bin

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

Если Вы говорите

PATH=~/opt/bin

это - все, что будет в Вашем ПУТИ. ПУТЬ Является просто переменной среды, и если Вы хотите добавить к ПУТИ, необходимо восстановить переменную с точно содержанием, которое Вы хотите. Таким образом, что Вы даете как пример для опроса 2, точно, что Вы хотите сделать, если я полностью не упускаю суть вопроса.

Я использую обе формы в своем коде. У меня есть универсальный профиль, который я устанавливаю на каждой машине, я работаю над этим, похож на это, для размещения для потенциально недостающих каталогов:

export PATH=/opt/bin:/usr/local/bin:/usr/contrib/bin:/bin:/usr/bin:/usr/sbin:/usr/bin/X11
# add optional items to the path
for bindir in $HOME/local/bin $HOME/bin; do
    if [ -d $bindir ]; then
        PATH=$PATH:${bindir}
    fi
done
38
27.01.2020, 19:27
  • 1
    Вы правы относительно примера вопроса 2, он работает. Другая связанная с путем проблема о моей системе смутила меня. Извините за это. спасибо –  Paolo 05.12.2011, 02:59

Linux определяет исполняемый путь поиска с $PATH переменная среды. Добавить каталог,/data/myscripts к началу $PATH переменная среды, используйте следующее:

PATH=/data/myscripts:$PATH

Чтобы добавить что каталог в конец пути, используйте следующую команду:

PATH=$PATH:/data/myscripts

Но предыдущие не достаточны, потому что при установке переменной среды в сценарии то изменение является эффективным только в рамках сценария. Существует только два пути вокруг этого ограничения:

  • В рамках сценария, при экспорте переменной среды, это эффективно в рамках любых программ, названных сценарием. Обратите внимание, что это не эффективно в рамках программы который названный сценарием.
  • Если программа, которая называет сценарий, делает так включением вместо вызова, любые изменения среды в сценарии являются эффективными в рамках программы вызова. Такое включение может быть сделано с точечной командой или исходной командой.

Примеры:

$HOME/myscript.sh
source $HOME/myscript.sh

Включение в основном включает "названный" сценарий в сценарий "вызова". Это похоже на #include в C. Таким образом, это эффективно в сценарии "вызова" или программе. Но конечно, это не эффективно ни при каких программах или сценариях, названных программой вызова. Для создания этого эффективным полностью вниз цепочка вызовов необходимо следовать за установкой переменной среды с командой экспорта.

Как пример, программная оболочка удара включает содержание файла .bash_profile включением. Поместите следующие 2 строки в .bash_profile:

PATH=$PATH:/data/myscripts
export PATH

эффективно помещает те 2 строки кода в программу удара. Таким образом в ударе, переменная $PATH включает $HOME/myscript.sh, и из-за оператора экспорта, любые программы, названные ударом, имеют измененный $PATH переменная. И потому что любые программы, которые Вы запускаете от подсказки удара, называет удар, новый путь находится в силе для чего-либо, что Вы выполняете от подсказки удара.

Нижняя строка - то, что для добавления нового каталога к пути необходимо добавить или предварительно ожидать каталог к переменной среды $PATH в рамках сценария, включенного в оболочку, и необходимо экспортировать $PATH переменная среды.

Больше информации здесь

25
27.01.2020, 19:27

Вот мое решение:

PATH=$(echo -n $PATH | awk -v RS=: -v ORS=: '!x[$0]++' | sed "s/\(.*\).\{1\}/\1/")

Приятный простой вкладыш, который не делает оставить трейлинг :

5
27.01.2020, 19:27

Видимо, это была ошибка в ядре. Он был исправлен в https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/drivers/scsi/storvsc_drv.c?id=e86fb5e8ab95f10ec5f2e9430119d5d35020c951

-121--186407-

gunzip и gzcat являются псевдонимами удобства для gzip -d и gzip -cd соответственно. На самом деле, если посмотреть, вы увидите, что они реализованы в виде сценариев оболочки, которые вызывают gzip с соответствующими опциями. Таким образом, существует нулевая разница в загрузке ЦП или других характеристиках производительности.

Возможная разница ввода-вывода зависит от того, выполняется ли запись выходных данных в файл. Но это не зависит от того, как вызывается gzip , поскольку, например, все следующие команды записывают свои выходные данные в файл:

gunzip file.gz
gzcat file.gz >file
gzip -cd file.gz >file

Если вы не записываете выходные данные в файл, а в канал, например:

gzcat file.gz | less
gzip -cd file.gz | mail root

Тогда вы можете заметить разницу, но это зависит от многих вещей, таких как, насколько велик файл, как часто и как долго конвейер останавливается, объем буферной памяти в вашей системе и т.д.

-121--128854-

Я не могу говорить за другие дистрибутивы, но Ubuntu имеет файл/etc/environment, который является путем поиска по умолчанию для всех пользователей. Поскольку мой компьютер используется только мной, я помещаю туда любые каталоги, которые я хочу, если только это не временное дополнение, которое я помещаю в сценарий.

10
27.01.2020, 19:27

Для меня (на Mac OS X 10. 9.5), добавление имени пути (например, /mypathname) в файл /etc/paths сработало очень хорошо.

Перед редактированием echo $PATH возвращает:

/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin

После редактирования /etc/paths и перезапуска оболочки, к переменной $PATH добавляется /pathname. Действительно, echo $PATH возвращает:

/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/mypathname

Произошло то, что /mypathname было добавлено к переменной $PATH.

6
29.04.2021, 00:57

В течение некоторого времени у меня есть две функции pathadd и pathrm , которые помогают добавлять элементы в путь, не беспокоясь о дублировании.

pathadd принимает единственный аргумент пути и необязательный после аргумента , который, если он указан, будет добавлен к PATH , в противном случае он добавит его в начало.

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

pathadd() {
    newelement=${1%/}
    if [ -d "$1" ] && ! echo $PATH | grep -E -q "(^|:)$newelement($|:)" ; then
        if [ "$2" = "after" ] ; then
            PATH="$PATH:$newelement"
        else
            PATH="$newelement:$PATH"
        fi
    fi
}

pathrm() {
    PATH="$(echo $PATH | sed -e "s;\(^\|:\)${1%/}\(:\|\$\);\1\2;g" -e 's;^:\|:$;;g' -e 's;::;:;g')"
}

Поместите их в любой сценарий, который вы хотите изменить среду PATH, и теперь вы можете это сделать.

pathadd "/foo/bar"
pathadd "/baz/bat" after
export PATH

Вы гарантированно не добавите к пути, если он уже есть. Если теперь вы хотите убедиться, что / baz / bat находится в начале.

pathrm "/baz/bat"
pathadd "/baz/bat"
export PATH

Теперь любой путь можно переместить на передний план, если он уже находится на пути, без дублирования.

21
29.04.2021, 00:57

Чтобы добавить новый путь к переменной окружения PATH:

export PATH=$PATH:/new-path/

Для этого изменения для применения к каждой открытой вами оболочке, добавьте его в файл, который оболочка будет источником при вызове. В разных оболочках это может быть:

  • Bash Shell: ~/.bash_profile, ~/.bashrc или profile
  • Korn Shell: ~/.kshrc или .profile
  • Z Shell: ~/.zshrc или .zprofile

например

# export PATH=$PATH:/root/learning/bin/
# source ~/.bashrc
# echo $PATH

Указанный путь можно увидеть в приведенном выше выводе.

10
20.08.2021, 13:31

Теги

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