Почему параметр $ 0 дает мне только базовое имя вместо полного пути после преобразования x-shellscript в x-исполняемый?

Моя проблема заключается в том, что параметр $0 дает тот же результат, что и ${0##*/} , и это происходит после преобразования x-shellscript в x-исполняемый файл с использованием программы SHC!

ОС: Debiab-8.2-jessie SHC версия: 3.8.7 cmd используется: shc -f script.bash

Скомпилированный скрипт.x находится в дополнительном пути bin (неизвестно sudo). Примечание. Я создал программу hello world для печати параметра $ 0, и он всегда дает мне базовое имя!

My scriptFile содержит:

 #!/bin/bash ((!EUID)) || exec sudo "$0" # shellcode ... 

Когда я его выполню, я получаю следующее:

sudo: scriptName: команда не найдена

После проверки я обнаружил, что параметр $0 совпадает с ${0##*/} или $(basename $0) внутри x-исполняемого файла!

Как я могу справиться с этим, не устанавливая абсолютный путь внутри скрипта? Или есть что-то, что я должен знать, когда компилирую оболочку в x-исполняемый, используя SHC?

2 Solutions collect form web for “Почему параметр $ 0 дает мне только базовое имя вместо полного пути после преобразования x-shellscript в x-исполняемый?”

Почему SHC?

Прежде всего, почему вы используете SHC, учитывая ваши мотивы «хобби»? Вот выдержка из их собственного описания:

После выполнения скомпилированный двоичный файл расшифровывает и выполняет код с помощью опции shell -c. К сожалению, это не даст вам никакого улучшения скорости, как настоящая программа на C.

Скомпилированный двоичный файл все равно будет зависеть от оболочки, указанной в первой строке кода оболочки (т.е. #! / Bin / sh), поэтому shc не создает полностью независимые двоичные файлы.

Основная цель SHC – защитить ваши сценарии оболочки от модификации или проверки.

  • Мое мнение (я буду держать его в курсе): Даже если ваша мотивация является заявленной «основной целью» предотвращения изменений, умеренно определенный человек может восстановить (и, следовательно, изменить) оригинальный скрипт! SHC по существу обеспечивает безопасность безвестности , которая является часто используемой стратегией при использовании в качестве основного средства безопасности. Если это не поможет, я бы рекомендовал использовать SHC и просто использовать сценарии оболочки, как это делает большинство других. Если вам нужна реальная безопасность для ваших сценариев оболочки, я бы предложил задать конкретный вопрос об этом без SHC или «компиляторов».

Конкретная проблема $ 0

Я загрузил SHC 3.8.9 с этой страницы, чтобы попробовать это.

Я не смог воспроизвести проблему, на Ubuntu 14.04 LTS.

 #!/bin/bash echo "Hello, world. My name is \`$0'" 

Тестовый забег

 $ ./shc -f my_test.bash $ ~/path/to/my_test.bash.x Hello, world. My name is `~/path/to/my_test.bash.x' 

Итак, наши системы отличаются друг от друга. Я могу попытаться обновить этот ответ, если вы разместите более подробную информацию о своей операционной системе, версии SHC и конкретном сценарии оболочки и командной строке shc вы использовали для «компиляции».

Зачем вам путь?

Почему ваш скрипт должен знать свой путь? Вы храните файлы со сценарием? Используется ли «default» для работы в каталоге, в котором он был запущен, если пользователь не указывает? Являются ли эти вещи хорошими идеями или нет, это вопрос мнения, но знание ваших мотивов могло бы помочь в сужении этого ответа.

Как получить текущий каталог

Команда pwd извлекает текущий каталог. Во многих случаях вы можете собрать полный путь к вашему сценарию (при условии, что он был запущен с явным относительным путем) с чем-то вроде:

 realname="`pwd`/$0" 

… что привело бы к такой ценности, как:

 /path/to/script/./yourscript.bash.x 

Дополнительный ./ просто означает «текущий каталог», поэтому, хотя это может быть косметически неудачно, это не будет отрицательно влиять на результат.

Если скрипт просто находится в вашем $PATH , вам нужно будет использовать, which вместо pwd , но мы уже выходим за рамки исходного вопроса, поэтому я завершу простым упоминанием, что определение путей может быть сложным процессом, особенно если вам нужно сделать это безопасным образом, так что лучше всего оставить другой вопрос с конкретным заданием проблемы в этих строках.

это потому, что bash (и / или ld.so) не помещает полное имя исполняемого файла в argv [0], когда он находит двоичный файл путем поиска по пути. если вы укажете каталог при запуске (вместо того, чтобы полагаться на путь), он получит правильное имя.

  • Сценарий Bash не заменяет переменную как ожидалось
  • Сценарий оболочки для проверки состояния точки монтирования на сервере linux
  • Выполнение команды на разных оболочках
  • sh + как использовать массив в sh-скрипте для печати всех значений в массиве
  • скрипт командной строки gnome-open
  • Shell Script - перенаправленный вывод в файл и результаты не ожидаются в первом запуске
  • Как именно «до $ @» работает в сценариях bash?
  • Сценарий Bash для scp-интерпретации тильды (~) слишком рано
  • проверка данных в столбцах, когда данные или некоторые могут отсутствовать или присутствовать?
  • Почему мой скрипт не выполняется на if.up
  • Выход из командной строки Memoizing / caching
  • Может ли 0-й физический ядро ​​использовать асимметрично в linux?

    В SMP и с алгоритмом справедливого планирования я ожидал бы, что все физические ядра машины будут использоваться равномерно linux. Теоретически я считаю, что это так, но на практике я подозреваю, что нет.

    У кого-нибудь есть хорошие объяснения, почему средняя установка linux может помочь ядру 0 для определенных процессов? Это реально возможно? Вы можете предположить, что сродство процессора для всех процессов пространства пользователя битмаскировано до 0xFFFFFFFF. Никаких пользовательских изменений в ядре тоже нет.

    One Solution collect form web for “Может ли 0-й физический ядро ​​использовать асимметрично в linux?”

    По умолчанию прерывания будут обрабатываться CPU0. Таким образом, даже со всеми приложениями, распределенными по всем ядрам, core0 получит больше работы. См. Например, irqtune для распространения прерываний.

  • Сценарий Bash не заменяет переменную как ожидалось
  • Сценарий оболочки для проверки состояния точки монтирования на сервере linux
  • Выполнение команды на разных оболочках
  • sh + как использовать массив в sh-скрипте для печати всех значений в массиве
  • скрипт командной строки gnome-open
  • Shell Script - перенаправленный вывод в файл и результаты не ожидаются в первом запуске
  • Как именно «до $ @» работает в сценариях bash?
  • Сценарий Bash для scp-интерпретации тильды (~) слишком рано
  • проверка данных в столбцах, когда данные или некоторые могут отсутствовать или присутствовать?
  • Почему мой скрипт не выполняется на if.up
  • Выход из командной строки Memoizing / caching
  • Как добавить нуль (0) в пробелы в большом файле (пример файла ниже)

    Вот пример файла, где мне нужно заменить пробелы нулевым

    A 2 2 2 2 2 B 2 2 2 2 2 C 2 2 2 2 2 DAEBF D R 

    3 Solutions collect form web for “Как добавить нуль (0) в пробелы в большом файле (пример файла ниже)”

    Следующее должно работать:

     tr '\t' 0 < file 1<> file 

    Отфильтруйте

     perl -pe 's/\t(?=\t|$)/\t0/g' 

    В регулярных выражениях Perl,

    • \tвкладка
    • (?=…) – это утверждение с нулевой шириной, которое я использовал для сопоставления только пустым полям.

    Параметры командной строки Perl

    • -e указывает, что следующий аргумент командной строки содержит программу Perl
    • -p вставляет шаблонный код, чтобы заставить его действовать как awk : выполнение кода Perl для каждой строки на входе и распечатка обработанной строки.

    Отфильтруйте

     awk '{ while (gsub("\t\t", "\t0\t")); sub("\t$", "\t0"); print }' 

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

  • Сценарий Bash не заменяет переменную как ожидалось
  • Сценарий оболочки для проверки состояния точки монтирования на сервере linux
  • Выполнение команды на разных оболочках
  • sh + как использовать массив в sh-скрипте для печати всех значений в массиве
  • скрипт командной строки gnome-open
  • Shell Script - перенаправленный вывод в файл и результаты не ожидаются в первом запуске
  • Как именно «до $ @» работает в сценариях bash?
  • Сценарий Bash для scp-интерпретации тильды (~) слишком рано
  • проверка данных в столбцах, когда данные или некоторые могут отсутствовать или присутствовать?
  • Почему мой скрипт не выполняется на if.up
  • Выход из командной строки Memoizing / caching
  • Как я могу использовать sed для удаления первого абзаца файла?
  • Как искать слово, сохраненное в пространстве удержания с помощью sed?
  • Печатать текст между (и включая) двумя разделителями по строке
  • sed - заменить строку содержимым файла
  • Заменить символ, кроме последних x входов
  • sed для удаления ведущего 91, если число равно 12 цифрам
  • Отдельные «дублированные строки» по пустой строке
  • sed + удалить слово из определенной строки
  • Как извлечь определенные поля из строк с помощью команд оболочки?
  • Распечатайте строку только в том случае, если следующая строка НЕ ​​содержит определенное совпадение
  • Заменить сложную строку в нескольких файлах
  • Может ли ИД потока быть 0?

    При перемещении /proc/$PID/task/ моя программа иногда (редко) попадает в подкаталог с именем 0 . После того, как я заметил это и проверил каталог, такого подкаталога уже нет.

    Возникает вопрос: может ли поток Id (который, я считаю, составляет содержание /proc/$PID/task/ ), равен нулю? Или это не поток Id, а что-то еще?

  • Сценарий Bash не заменяет переменную как ожидалось
  • Сценарий оболочки для проверки состояния точки монтирования на сервере linux
  • Выполнение команды на разных оболочках
  • sh + как использовать массив в sh-скрипте для печати всех значений в массиве
  • скрипт командной строки gnome-open
  • Shell Script - перенаправленный вывод в файл и результаты не ожидаются в первом запуске
  • Как именно «до $ @» работает в сценариях bash?
  • Сценарий Bash для scp-интерпретации тильды (~) слишком рано
  • проверка данных в столбцах, когда данные или некоторые могут отсутствовать или присутствовать?
  • Почему мой скрипт не выполняется на if.up
  • Выход из командной строки Memoizing / caching
  • Как я могу использовать sed для удаления первого абзаца файла?
  • Как искать слово, сохраненное в пространстве удержания с помощью sed?
  • Печатать текст между (и включая) двумя разделителями по строке
  • sed - заменить строку содержимым файла
  • Заменить символ, кроме последних x входов
  • sed для удаления ведущего 91, если число равно 12 цифрам
  • Отдельные «дублированные строки» по пустой строке
  • sed + удалить слово из определенной строки
  • Как извлечь определенные поля из строк с помощью команд оболочки?
  • Распечатайте строку только в том случае, если следующая строка НЕ ​​содержит определенное совпадение
  • Заменить сложную строку в нескольких файлах
  • Что такое / proc / dma? Это только для старой поддержки?
  • Как узнать, что находится в сеансе
  • Как скрывать на Arch Linux вручную?
  • Почему процесс двоичного файла с разрешением только на выполнение остается скрытым в «ps» при использовании hidepid = 2, если пользователь не является root?
  • файлы в / proc / $ PID (например, ssh-agent, Chrome) не принадлежат пользователю, а root
  • Получить нагрузку на процессор ядра в сценарии оболочки
  • Измените «Мягкий предел» «Максимальных процессов»
  • Как Linux читает «реальные файлы» и «виртуальные файлы»?
  • Восстановить от faking / proc / meminfo
  • идентификатор / идентификатор процесса анализа из / proc, идентификаторы потоков
  • Как узнать, что я могу сделать с / proc и / sys
  • Что делает $ 0 при вызове через символическую ссылку?

    Параметр оболочки $0 содержит имя вызывающей программы. Если вы сделаете символическую ссылку с именем my_command в своем домашнем каталоге на команду /usr/local/bin/command1 и вы ее выполнили, введя ./my_command , что будет значением $0 ? Может ли кто-нибудь объяснить, почему? Благодаря!

    2 Solutions collect form web for “Что делает $ 0 при вызове через символическую ссылку?”

    $0 не содержит имя вызывающей программы, а имя вызываемой программы. ./my_command программа ./my_command поэтому $0 будет ./my_command .

    То, что это символическая ссылка, не имеет значения.

    Командная строка (или, скорее, в UNIX, массив аргументов командной строки), включая то, что станет $0 , передается вызову exec вызывающей программой.

    Разрешение Symlink, обработка shebang и т. Д. Производится только после этого системой, как частью обработки вызова exec .

  • Сценарий Bash не заменяет переменную как ожидалось
  • Сценарий оболочки для проверки состояния точки монтирования на сервере linux
  • Выполнение команды на разных оболочках
  • sh + как использовать массив в sh-скрипте для печати всех значений в массиве
  • скрипт командной строки gnome-open
  • Shell Script - перенаправленный вывод в файл и результаты не ожидаются в первом запуске
  • Как именно «до $ @» работает в сценариях bash?
  • Сценарий Bash для scp-интерпретации тильды (~) слишком рано
  • проверка данных в столбцах, когда данные или некоторые могут отсутствовать или присутствовать?
  • Почему мой скрипт не выполняется на if.up
  • Выход из командной строки Memoizing / caching
  • Как я могу использовать sed для удаления первого абзаца файла?
  • Как искать слово, сохраненное в пространстве удержания с помощью sed?
  • Печатать текст между (и включая) двумя разделителями по строке
  • sed - заменить строку содержимым файла
  • Заменить символ, кроме последних x входов
  • sed для удаления ведущего 91, если число равно 12 цифрам
  • Отдельные «дублированные строки» по пустой строке
  • sed + удалить слово из определенной строки
  • Как извлечь определенные поля из строк с помощью команд оболочки?
  • Распечатайте строку только в том случае, если следующая строка НЕ ​​содержит определенное совпадение
  • Заменить сложную строку в нескольких файлах
  • Что такое / proc / dma? Это только для старой поддержки?
  • Как узнать, что находится в сеансе
  • Как скрывать на Arch Linux вручную?
  • Почему процесс двоичного файла с разрешением только на выполнение остается скрытым в «ps» при использовании hidepid = 2, если пользователь не является root?
  • файлы в / proc / $ PID (например, ssh-agent, Chrome) не принадлежат пользователю, а root
  • Получить нагрузку на процессор ядра в сценарии оболочки
  • Измените «Мягкий предел» «Максимальных процессов»
  • Как Linux читает «реальные файлы» и «виртуальные файлы»?
  • Восстановить от faking / proc / meminfo
  • идентификатор / идентификатор процесса анализа из / proc, идентификаторы потоков
  • Как узнать, что я могу сделать с / proc и / sys
  • Поведение команды `du` с флагом` -L`
  • Как отношение / dev / fd относится к / proc / self / fd /?
  • Определение, является ли файл жесткой ссылкой или символической ссылкой?
  • Создать ссылку между двумя существующими файлами
  • Почему символические ссылки не имеют блоков данных, выделенных им в ext4fs?
  • Почему ln -s скопировал файл, а не связал его?
  • tomcat: символическая ссылка в цикле
  • Если символическая ссылка на NFS указывает на локальный диск, будет ли потерян локальный диск?
  • linux как cd к родительской папке, если она перемещается через символическую ссылку
  • Как удалить символические ссылки, указывающие на файлы в определенной папке?
  • symlink / home / username / Documenten tot 2nd partition?
  • Добавить 0 в середине имени файла

    $ ls pro2e_u01_txt_vocabulaire_11_descriptiveadjectives.mp3 pro2e_u01_txt_vocabulaire_12_nationality.mp3 pro2e_u01_txt_vocabulaire_1_campus.mp3 pro2e_u01_txt_vocabulaire_2_personnes.mp3 pro2e_u01_txt_vocabulaire_3_presentations.mp3 pro2e_u01_txt_vocabulaire_4_identifier.mp3 pro2e_u01_txt_vocabulaire_5_bonjouraurevoir.mp3 pro2e_u01_txt_vocabulaire_6_commentcava.mp3 pro2e_u01_txt_vocabulaire_7_expressionspolitesse.mp3 

    Я хотел бы добавить '0' перед номерами в середине, чтобы они были отсортированы как в

     $ ls -v pro2e_u01_txt_vocabulaire_1_campus.mp3 pro2e_u01_txt_vocabulaire_2_personnes.mp3 pro2e_u01_txt_vocabulaire_3_presentations.mp3 pro2e_u01_txt_vocabulaire_4_identifier.mp3 pro2e_u01_txt_vocabulaire_5_bonjouraurevoir.mp3 pro2e_u01_txt_vocabulaire_6_commentcava.mp3 pro2e_u01_txt_vocabulaire_7_expressionspolitesse.mp3 pro2e_u01_txt_vocabulaire_11_descriptiveadjectives.mp3 pro2e_u01_txt_vocabulaire_12_nationality.mp3 

    То, что я до сих пор

     $ for i in *.mp3; do echo ${i/_[0-9]_/_0¿_}; done pro2e_u01_txt_vocabulaire_11_descriptiveadjectives.mp3 pro2e_u01_txt_vocabulaire_12_nationality.mp3 pro2e_u01_txt_vocabulaire_0¿_campus.mp3 pro2e_u01_txt_vocabulaire_0¿_personnes.mp3 pro2e_u01_txt_vocabulaire_0¿_presentations.mp3 pro2e_u01_txt_vocabulaire_0¿_identifier.mp3 pro2e_u01_txt_vocabulaire_0¿_bonjouraurevoir.mp3 pro2e_u01_txt_vocabulaire_0¿_commentcava.mp3 pro2e_u01_txt_vocabulaire_0¿_expressionspolitesse.mp3 

    Я не знаю, что должно быть помещено вместо «¿», чтобы вместо этого появилось число, совпадающее с [0-9].

    5 Solutions collect form web for “Добавить 0 в середине имени файла”

    Иногда конкретное решение достаточно хорошо; как в текущем случае, когда вы можете идентифицировать шаблоны для подмножества файлов для рассмотрения (например, /_[0-9]_/ ) и добавить /re_/ ноль в зависимости от уникально идентифицирующего префикса (например, /re_/ ). Все вместе:

     for f in *_[0-9]_*.mp3 ; do mv -i "${f}" "${f/re_/re_0}" ; done 

    Для предварительной проверки, которую вы попросили, вы можете добавить echo перед mv .

    Вы можете сделать это с rename из util-linux :

     rename vocabulaire_ vocabulaire_0 *vocabulaire_[0-9]_*.mp3 

    результат:

     pro2e_u01_txt_vocabulaire_01_campus.mp3 pro2e_u01_txt_vocabulaire_02_personnes.mp3 pro2e_u01_txt_vocabulaire_12_nationality.mp3 pro2e_u01_txt_vocabulaire_231_whatever.mp3 

    если вы хотите продолжить нуль-площадку, повторите команду, увеличив количество цифр:

     rename vocabulaire_ vocabulaire_0 *vocabulaire_[0-9][0-9]_*.mp3 

    результат:

     pro2e_u01_txt_vocabulaire_001_campus.mp3 pro2e_u01_txt_vocabulaire_002_personnes.mp3 pro2e_u01_txt_vocabulaire_012_nationality.mp3 pro2e_u01_txt_vocabulaire_231_whatever.mp3 
     for f in ./*.mp3 do set "${f%_*}" "_${f##*_}"; f=10${1##*_} mv "$1$2" "${1%_*}_${f#*$((${#f}<4))}$2" done 

    Это должно работать, я думаю, до тех пор, пока ваше числовое поле находится между последним и вторым-последним разделенным полем и при условии, что вы хотите только проложить до двухзначных мест.

    В Debian, Ubuntu и других системах, где rename является Perl-скриптом (в отличие от одного в util-linux), эта команда будет достаточной, если файлы от 1 до 99.

     rename 's/_vocabulaire_([0-9]{1})_/_vocabulaire_0$1_/' *.mp3 

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

     rename -n 's/_vocabulaire_([0-9]{1})_/_vocabulaire_0$1_/' *.mp3 

    Для следующих файлов:

     test0.txt test1.txt test2.txt ... test1234.txt 

    Это сработало для меня:

     rename 's/test([0-9]{1}).txt/test0$1.txt/' * rename 's/test([0-9]{2}).txt/test0$1.txt/' * rename 's/test([0-9]{3}).txt/test0$1.txt/' * 

    Результат:

     test0000.txt test0001.txt test0002.txt ... test1234.txt 

    Конечно, вы можете обернуть его внутри цикла.

    Важно: если ваши файлы начинаются или заканчиваются номерами, которые вы хотите отложить, вы должны использовать ^ и $ для соответствия началу и концу, например:

     rename 's/^([0-9]{1}).txt/0$1.txt/' * 

    или

     rename 's/test([0-9]{1})$/test0$1/' * 

    Вы можете использовать параметр rename ' -n для предварительного просмотра изменений без фактического переименования, например:

     rename -n 's/test([0-9]{1}).txt/test0$1.txt/' * 
  • Сценарий Bash не заменяет переменную как ожидалось
  • Сценарий оболочки для проверки состояния точки монтирования на сервере linux
  • Выполнение команды на разных оболочках
  • sh + как использовать массив в sh-скрипте для печати всех значений в массиве
  • скрипт командной строки gnome-open
  • Shell Script - перенаправленный вывод в файл и результаты не ожидаются в первом запуске
  • Как именно «до $ @» работает в сценариях bash?
  • Сценарий Bash для scp-интерпретации тильды (~) слишком рано
  • проверка данных в столбцах, когда данные или некоторые могут отсутствовать или присутствовать?
  • Почему мой скрипт не выполняется на if.up
  • Выход из командной строки Memoizing / caching
  • Как я могу использовать sed для удаления первого абзаца файла?
  • Как искать слово, сохраненное в пространстве удержания с помощью sed?
  • Печатать текст между (и включая) двумя разделителями по строке
  • sed - заменить строку содержимым файла
  • Заменить символ, кроме последних x входов
  • sed для удаления ведущего 91, если число равно 12 цифрам
  • Отдельные «дублированные строки» по пустой строке
  • sed + удалить слово из определенной строки
  • Как извлечь определенные поля из строк с помощью команд оболочки?
  • Распечатайте строку только в том случае, если следующая строка НЕ ​​содержит определенное совпадение
  • Заменить сложную строку в нескольких файлах
  • Что такое / proc / dma? Это только для старой поддержки?
  • Как узнать, что находится в сеансе
  • Как скрывать на Arch Linux вручную?
  • Почему процесс двоичного файла с разрешением только на выполнение остается скрытым в «ps» при использовании hidepid = 2, если пользователь не является root?
  • файлы в / proc / $ PID (например, ssh-agent, Chrome) не принадлежат пользователю, а root
  • Получить нагрузку на процессор ядра в сценарии оболочки
  • Измените «Мягкий предел» «Максимальных процессов»
  • Как Linux читает «реальные файлы» и «виртуальные файлы»?
  • Восстановить от faking / proc / meminfo
  • идентификатор / идентификатор процесса анализа из / proc, идентификаторы потоков
  • Как узнать, что я могу сделать с / proc и / sys
  • Поведение команды `du` с флагом` -L`
  • Как отношение / dev / fd относится к / proc / self / fd /?
  • Определение, является ли файл жесткой ссылкой или символической ссылкой?
  • Создать ссылку между двумя существующими файлами
  • Почему символические ссылки не имеют блоков данных, выделенных им в ext4fs?
  • Почему ln -s скопировал файл, а не связал его?
  • tomcat: символическая ссылка в цикле
  • Если символическая ссылка на NFS указывает на локальный диск, будет ли потерян локальный диск?
  • linux как cd к родительской папке, если она перемещается через символическую ссылку
  • Как удалить символические ссылки, указывающие на файлы в определенной папке?
  • symlink / home / username / Documenten tot 2nd partition?
  • Как извлечь определенные элементы из имени файла?
  • Имена файлов каталогов с sed с пробелами
  • Элементы списка с пробелами в zsh
  • Внутреннее расширение с помощью команды find и символа подстановки
  • Что означает «//» взамен от `which`
  • `/ proc / $ PID / cwd`: есть ли эквивалент POSIX?
  • Почему моя программа «set» не выполняется?
  • Как отображать «доступные для человека» размеры файлов в результатах поиска?
  • Как выполнить инструкцию IF из результата выполненной команды
  • Почему «while .. read .. << EOL» выполняет расширение переменной, но <файл и | не?
  • Как я могу запустить `watch` в качестве фоновой работы?
  • Почему $ # всегда 0 в моей функции?

    Баш сводит меня с ума. Я не могу понять, почему следующий (ни один из десятков вариантов, которые я буквально не скопировал и не наклеил на примерах) не работает:

    #!/bin/bash echo $# function main { if (( $# < 1 )); then usage fi echo "good" } function usage { echo "Usage: $0 <outputdir>" exit 1 } main 

    По какой-то причине проверка аргументов терпит неудачу каждый раз, даже когда я передаю аргумент и ясно вижу, что $# установлен как ожидалось.

    2 Solutions collect form web for “Почему $ # всегда 0 в моей функции?”

    Это должно работать:

     #!/bin/bash set -x NARGS=$# function main { if [ $NARGS -lt 1 ]; then usage fi echo good } function usage { echo "Usage: $0 <outputdir>" exit 1 } main 

    Я специально set -x . Полезно отлаживать эти ошибки. Если вы не передадите какие-либо аргументы main функции, $# станет 0 внутри нее (замените $NARGS на $# в if чтобы увидеть это).

    Вы вызываете main функцию без аргументов. Таким образом, $# в основной функции всегда равно 0.

    Каждый экземпляр функции имеет свои собственные аргументы. («Экземпляр» означает, что если функция запускается несколько раз (через рекурсивные вызовы), каждый вызов имеет свои собственные аргументы.) Позиционные параметры $1 , $2 и т. Д., А также связанные параметры $# , $* и $@ обратитесь к аргументам, переданным в вызове функции. Например, если вы вызываете main foo bar то внутри main функции значение $1 будет foo , значение $# будет равно 2 и так далее.

    Если вы хотите передать аргументы сценария функции, используйте "$@" . Эта конструкция расширяется до списка аргументов, переданных скрипту (или функции, если вызывается внутри функции). Обратите внимание, что в отличие от того, что обычно происходит с двойными кавычками, параметры передаются отдельно, "$@" – это список строк, а не одна строка. Необходимы двойные кавычки, в противном случае параметры не передаются, а рассматриваются как список шаблонов имен файлов, разделенных пробелами.

     function main { if (( $# < 1 )); then usage fi echo "good" } main "$@" 
  • Сценарий Bash не заменяет переменную как ожидалось
  • Сценарий оболочки для проверки состояния точки монтирования на сервере linux
  • Выполнение команды на разных оболочках
  • sh + как использовать массив в sh-скрипте для печати всех значений в массиве
  • скрипт командной строки gnome-open
  • Shell Script - перенаправленный вывод в файл и результаты не ожидаются в первом запуске
  • Как именно «до $ @» работает в сценариях bash?
  • Сценарий Bash для scp-интерпретации тильды (~) слишком рано
  • проверка данных в столбцах, когда данные или некоторые могут отсутствовать или присутствовать?
  • Почему мой скрипт не выполняется на if.up
  • Выход из командной строки Memoizing / caching
  • Как я могу использовать sed для удаления первого абзаца файла?
  • Как искать слово, сохраненное в пространстве удержания с помощью sed?
  • Печатать текст между (и включая) двумя разделителями по строке
  • sed - заменить строку содержимым файла
  • Заменить символ, кроме последних x входов
  • sed для удаления ведущего 91, если число равно 12 цифрам
  • Отдельные «дублированные строки» по пустой строке
  • sed + удалить слово из определенной строки
  • Как извлечь определенные поля из строк с помощью команд оболочки?
  • Распечатайте строку только в том случае, если следующая строка НЕ ​​содержит определенное совпадение
  • Заменить сложную строку в нескольких файлах
  • Что такое / proc / dma? Это только для старой поддержки?
  • Как узнать, что находится в сеансе
  • Как скрывать на Arch Linux вручную?
  • Почему процесс двоичного файла с разрешением только на выполнение остается скрытым в «ps» при использовании hidepid = 2, если пользователь не является root?
  • файлы в / proc / $ PID (например, ssh-agent, Chrome) не принадлежат пользователю, а root
  • Получить нагрузку на процессор ядра в сценарии оболочки
  • Измените «Мягкий предел» «Максимальных процессов»
  • Как Linux читает «реальные файлы» и «виртуальные файлы»?
  • Восстановить от faking / proc / meminfo
  • идентификатор / идентификатор процесса анализа из / proc, идентификаторы потоков
  • Как узнать, что я могу сделать с / proc и / sys
  • Поведение команды `du` с флагом` -L`
  • Как отношение / dev / fd относится к / proc / self / fd /?
  • Определение, является ли файл жесткой ссылкой или символической ссылкой?
  • Создать ссылку между двумя существующими файлами
  • Почему символические ссылки не имеют блоков данных, выделенных им в ext4fs?
  • Почему ln -s скопировал файл, а не связал его?
  • tomcat: символическая ссылка в цикле
  • Если символическая ссылка на NFS указывает на локальный диск, будет ли потерян локальный диск?
  • linux как cd к родительской папке, если она перемещается через символическую ссылку
  • Как удалить символические ссылки, указывающие на файлы в определенной папке?
  • symlink / home / username / Documenten tot 2nd partition?
  • Как извлечь определенные элементы из имени файла?
  • Имена файлов каталогов с sed с пробелами
  • Элементы списка с пробелами в zsh
  • Внутреннее расширение с помощью команды find и символа подстановки
  • Что означает «//» взамен от `which`
  • `/ proc / $ PID / cwd`: есть ли эквивалент POSIX?
  • Почему моя программа «set» не выполняется?
  • Как отображать «доступные для человека» размеры файлов в результатах поиска?
  • Как выполнить инструкцию IF из результата выполненной команды
  • Почему «while .. read .. << EOL» выполняет расширение переменной, но <файл и | не?
  • Как я могу запустить `watch` в качестве фоновой работы?
  • Где $ _ определяется POSIX?
  • ссылочная переменная оболочки $ COLUMNS из сценария bash
  • Преобразование рабочей команды в файл сценария оболочки, который получает аргументы
  • Как запустить скрипт bash из сценария sh (dash)?
  • Как программно отключить пользователя ssh?
  • как разрешить sudo fork bash вместо sh?
  • Вернитесь в каталог до cd-ing в домашний каталог
  • shell-скрипт для имени файла chmod, но только для новых файлов с момента последнего запуска скрипта
  • О выполнении сценария оболочки
  • Есть ли причина, чтобы shebang указывал на / bin / sh, а не / bin / bash?
  • Как распечатать последнее время входа?
  • Что значит быть в группе 0?

    Несколько пользователей в системе, унаследованной системой, имеют свою группу в 0 в / etc / passwd. Что это значит? По существу ли они получают полные привилегии?

    Система работает CentOS 5, и пользователи, как представляется, в основном связаны с системой, хотя бывший администратор также находится в этой группе:

    $ grep :0: /etc/passwd root:x:0:0:root:/root:/bin/bash sync:x:5:0:sync:/sbin:/bin/sync shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown halt:x:7:0:halt:/sbin:/sbin/halt operator:x:11:0:operator:/root:/sbin/nologin jsmith:x:500:0:Joe Smith:/home/jsmith:/bin/bash $ 

    3 Solutions collect form web for “Что значит быть в группе 0?”

    В отличие от пользователя 0 (пользователь root), группа 0 не имеет специальных привилегий на уровне ядра.

    Традиционно группа 0 имела особые привилегии во многих вариантах unix – либо право использовать su для root (после ввода пароля root), либо право стать root без ввода пароля. В основном, пользователи в группе 0 были системными администраторами. Когда группа 0 имеет особые привилегии, она называется wheel

    В Linux группа 0 не имеет особого значения для привилегий эскалации, таких как sudo и su . См. Почему Debian не создает группу «колесо» по умолчанию?

    В CentOS, насколько мне известно, группа 0 не имеет особого значения. Он не упоминается в файле sudoers по умолчанию. Администраторы этой системы, возможно, решили подражать традиции unix и предоставить членам группы 0 некоторые специальные разрешения. Проверьте конфигурацию PAM ( /etc/pam.conf , /etc/pam.d/* ) и файл sudoers ( /etc/sudoers ) (это не единственные места, где группе 0 могли быть предоставлены особые привилегии, но скорее всего).

    В отличие от идентификатора пользователя 0, ядро ​​не дает каких-либо специальных разрешений группе 0. Однако, поскольку 0 обычно является группой по умолчанию для пользователя root , это означает, что эти люди часто смогут получать доступ или изменять файлы, принадлежащие root (поскольку эти файлы часто также принадлежат группе 0).

    Кроме того, некоторые программы могут относиться к группе 0 специально. Например, su на некоторых BSD-системах предоставит доступ без доступа к членам группы 0 .

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

    Это просто означает, что их основная группа является root а не чем-либо еще, и поэтому, например, они используют групповые настройки при обращении к файлам, где настройки группы являются root .

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

    Он не предоставляет полные привилегии.

  • Сценарий Bash не заменяет переменную как ожидалось
  • Сценарий оболочки для проверки состояния точки монтирования на сервере linux
  • Выполнение команды на разных оболочках
  • sh + как использовать массив в sh-скрипте для печати всех значений в массиве
  • скрипт командной строки gnome-open
  • Shell Script - перенаправленный вывод в файл и результаты не ожидаются в первом запуске
  • Как именно «до $ @» работает в сценариях bash?
  • Сценарий Bash для scp-интерпретации тильды (~) слишком рано
  • проверка данных в столбцах, когда данные или некоторые могут отсутствовать или присутствовать?
  • Почему мой скрипт не выполняется на if.up
  • Выход из командной строки Memoizing / caching
  • Как я могу использовать sed для удаления первого абзаца файла?
  • Как искать слово, сохраненное в пространстве удержания с помощью sed?
  • Печатать текст между (и включая) двумя разделителями по строке
  • sed - заменить строку содержимым файла
  • Заменить символ, кроме последних x входов
  • sed для удаления ведущего 91, если число равно 12 цифрам
  • Отдельные «дублированные строки» по пустой строке
  • sed + удалить слово из определенной строки
  • Как извлечь определенные поля из строк с помощью команд оболочки?
  • Распечатайте строку только в том случае, если следующая строка НЕ ​​содержит определенное совпадение
  • Заменить сложную строку в нескольких файлах
  • Что такое / proc / dma? Это только для старой поддержки?
  • Как узнать, что находится в сеансе
  • Как скрывать на Arch Linux вручную?
  • Почему процесс двоичного файла с разрешением только на выполнение остается скрытым в «ps» при использовании hidepid = 2, если пользователь не является root?
  • файлы в / proc / $ PID (например, ssh-agent, Chrome) не принадлежат пользователю, а root
  • Получить нагрузку на процессор ядра в сценарии оболочки
  • Измените «Мягкий предел» «Максимальных процессов»
  • Как Linux читает «реальные файлы» и «виртуальные файлы»?
  • Восстановить от faking / proc / meminfo
  • идентификатор / идентификатор процесса анализа из / proc, идентификаторы потоков
  • Как узнать, что я могу сделать с / proc и / sys
  • Поведение команды `du` с флагом` -L`
  • Как отношение / dev / fd относится к / proc / self / fd /?
  • Определение, является ли файл жесткой ссылкой или символической ссылкой?
  • Создать ссылку между двумя существующими файлами
  • Почему символические ссылки не имеют блоков данных, выделенных им в ext4fs?
  • Почему ln -s скопировал файл, а не связал его?
  • tomcat: символическая ссылка в цикле
  • Если символическая ссылка на NFS указывает на локальный диск, будет ли потерян локальный диск?
  • linux как cd к родительской папке, если она перемещается через символическую ссылку
  • Как удалить символические ссылки, указывающие на файлы в определенной папке?
  • symlink / home / username / Documenten tot 2nd partition?
  • Как извлечь определенные элементы из имени файла?
  • Имена файлов каталогов с sed с пробелами
  • Элементы списка с пробелами в zsh
  • Внутреннее расширение с помощью команды find и символа подстановки
  • Что означает «//» взамен от `which`
  • `/ proc / $ PID / cwd`: есть ли эквивалент POSIX?
  • Почему моя программа «set» не выполняется?
  • Как отображать «доступные для человека» размеры файлов в результатах поиска?
  • Как выполнить инструкцию IF из результата выполненной команды
  • Почему «while .. read .. << EOL» выполняет расширение переменной, но <файл и | не?
  • Как я могу запустить `watch` в качестве фоновой работы?
  • Где $ _ определяется POSIX?
  • ссылочная переменная оболочки $ COLUMNS из сценария bash
  • Преобразование рабочей команды в файл сценария оболочки, который получает аргументы
  • Как запустить скрипт bash из сценария sh (dash)?
  • Как программно отключить пользователя ssh?
  • как разрешить sudo fork bash вместо sh?
  • Вернитесь в каталог до cd-ing в домашний каталог
  • shell-скрипт для имени файла chmod, но только для новых файлов с момента последнего запуска скрипта
  • О выполнении сценария оболочки
  • Есть ли причина, чтобы shebang указывал на / bin / sh, а не / bin / bash?
  • Как распечатать последнее время входа?
  • Когда именно tmpwatch очищает файлы, я помещаю их в / tmp?
  • DNSMasq - разные ответы на конкретные MAC-адреса
  • egrep несколько шаблонов с тире
  • Что такое SELinux ".lst" файлы в / usr / share / selinux / предназначенные для CentOS 7?
  • Установка NFS через systemd в Centos 7
  • Как остановить «Opto Host», взяв порт (Linux)
  • Какие системные журналы могут сказать мне, потерял ли сервер интернет-соединение?
  • php 7 устанавливает броски «Не могу загрузить Zend OPcache - он уже был загружен»
  • Обновление ядра 2.6 до 3.5.3 на CentOS 5.8 -> switchroot: mount failed: нет такого файла или каталога
  • Использование файла электронной почты для записи в / etc / aliases дает ошибки в EL7
  • Конфигурация сервера IPA: нельзя использовать IP-адрес сети
  • Что на самом деле убивает 0?

    На man page руководства говорится:

     kill [ -s signal | -p ] [ -a ] [ -- ] pid ... pid... Specify the list of processes that kill should signal. Each pid can be one of five things: 0 All processes in the current process group are signaled 

    И я пробовал вот так в bash:

     $ man kill & [1] 15247 $ [1]+ Stopped man kill $ kill 0 $ ps 15247 pts/41 00:00:00 man 

    Здесь 0 используется как pid . Как я понял, kill 0 убьет все процессы в текущем процессе, включая pid15247 . Однако в этом примере он ничего не делал. Кто-нибудь есть идеи о том, как его использовать?

    One Solution collect form web for “Что на самом деле убивает 0?”

    Как он говорит, он посылает сигнал всем членам группы процессов вызывающего.

    Группы процессов используются для реализации управления заданиями в оболочке (их можно использовать для других целей, но интерактивная проверка работы оболочки – основная причина их существования).

    Вы заметите, что при вводе Ctrl-C все процессы текущих заданий будут убиты, а не только тот, который их запустил. Кроме того, это не убивает фоновые задания.

    Это достигается с помощью групп процессов. Задание – это группа процессов, запускаемых оболочкой, которую оболочка может помещать в фоновом режиме или переднем плане (задан как группа процесса переднего плана терминала или нет) и убивать в целом.

    Вы можете узнать об идентификаторах группы процессов и идентификаторах сеанса с помощью ps -j ( j для J ob control).

    Чтобы убить группу процессов PGID $x , выполните следующие действия:

     kill -- "-$x" 

    kill 0 убивает группу процессов вызывающего.

    Обратите внимание, что если вы выполните: /bin/kill 0 , оболочка запустит новое задание для выполнения этой команды kill , так что kill просто убивает себя.

    kill обычно является оболочкой, но kill убивает группу процессов оболочки.

    Однако, когда оболочка является интерактивной, это процесс, управляющий группами процессов, поэтому обычно в группе процессов оболочки нет другого процесса. Все процессы, запущенные оболочкой, находятся в других группах процессов:

     $ sleep 1000 & [1] 22746 $ ps -j PID PGID SID TTY TIME CMD 22735 22735 22735 pts/23 00:00:00 zsh 22746 22746 22735 pts/23 00:00:00 sleep 22749 22749 22735 pts/23 00:00:00 ps 

    Выше, sleep и ps находятся в двух разных группах процессов, один в фоновом режиме, один на переднем плане и они отличаются от группы процессов оболочки.

    Вы могли бы сделать:

     (man kill & sleep 1; ps -j; kill 0) 

    Интерактивная оболочка начнет новую группу процессов для этой подоболочки, и как подоболочка, так и человек (и другие команды, созданные человеком, как ваш пейджер, groff …) будут в той же группе процессов, поэтому kill 0 будет работать там , ( sleep выше – дать достаточно времени для запуска пейджера, чтобы мы могли увидеть его в выводе ps -j прежде чем мы его убьем).

  • Сценарий Bash не заменяет переменную как ожидалось
  • Сценарий оболочки для проверки состояния точки монтирования на сервере linux
  • Выполнение команды на разных оболочках
  • sh + как использовать массив в sh-скрипте для печати всех значений в массиве
  • скрипт командной строки gnome-open
  • Shell Script - перенаправленный вывод в файл и результаты не ожидаются в первом запуске
  • Как именно «до $ @» работает в сценариях bash?
  • Сценарий Bash для scp-интерпретации тильды (~) слишком рано
  • проверка данных в столбцах, когда данные или некоторые могут отсутствовать или присутствовать?
  • Почему мой скрипт не выполняется на if.up
  • Выход из командной строки Memoizing / caching
  • Как я могу использовать sed для удаления первого абзаца файла?
  • Как искать слово, сохраненное в пространстве удержания с помощью sed?
  • Печатать текст между (и включая) двумя разделителями по строке
  • sed - заменить строку содержимым файла
  • Заменить символ, кроме последних x входов
  • sed для удаления ведущего 91, если число равно 12 цифрам
  • Отдельные «дублированные строки» по пустой строке
  • sed + удалить слово из определенной строки
  • Как извлечь определенные поля из строк с помощью команд оболочки?
  • Распечатайте строку только в том случае, если следующая строка НЕ ​​содержит определенное совпадение
  • Заменить сложную строку в нескольких файлах
  • Что такое / proc / dma? Это только для старой поддержки?
  • Как узнать, что находится в сеансе
  • Как скрывать на Arch Linux вручную?
  • Почему процесс двоичного файла с разрешением только на выполнение остается скрытым в «ps» при использовании hidepid = 2, если пользователь не является root?
  • файлы в / proc / $ PID (например, ssh-agent, Chrome) не принадлежат пользователю, а root
  • Получить нагрузку на процессор ядра в сценарии оболочки
  • Измените «Мягкий предел» «Максимальных процессов»
  • Как Linux читает «реальные файлы» и «виртуальные файлы»?
  • Восстановить от faking / proc / meminfo
  • идентификатор / идентификатор процесса анализа из / proc, идентификаторы потоков
  • Как узнать, что я могу сделать с / proc и / sys
  • Поведение команды `du` с флагом` -L`
  • Как отношение / dev / fd относится к / proc / self / fd /?
  • Определение, является ли файл жесткой ссылкой или символической ссылкой?
  • Создать ссылку между двумя существующими файлами
  • Почему символические ссылки не имеют блоков данных, выделенных им в ext4fs?
  • Почему ln -s скопировал файл, а не связал его?
  • tomcat: символическая ссылка в цикле
  • Если символическая ссылка на NFS указывает на локальный диск, будет ли потерян локальный диск?
  • linux как cd к родительской папке, если она перемещается через символическую ссылку
  • Как удалить символические ссылки, указывающие на файлы в определенной папке?
  • symlink / home / username / Documenten tot 2nd partition?
  • Как извлечь определенные элементы из имени файла?
  • Имена файлов каталогов с sed с пробелами
  • Элементы списка с пробелами в zsh
  • Внутреннее расширение с помощью команды find и символа подстановки
  • Что означает «//» взамен от `which`
  • `/ proc / $ PID / cwd`: есть ли эквивалент POSIX?
  • Почему моя программа «set» не выполняется?
  • Как отображать «доступные для человека» размеры файлов в результатах поиска?
  • Как выполнить инструкцию IF из результата выполненной команды
  • Почему «while .. read .. << EOL» выполняет расширение переменной, но <файл и | не?
  • Как я могу запустить `watch` в качестве фоновой работы?
  • Где $ _ определяется POSIX?
  • ссылочная переменная оболочки $ COLUMNS из сценария bash
  • Преобразование рабочей команды в файл сценария оболочки, который получает аргументы
  • Как запустить скрипт bash из сценария sh (dash)?
  • Как программно отключить пользователя ssh?
  • как разрешить sudo fork bash вместо sh?
  • Вернитесь в каталог до cd-ing в домашний каталог
  • shell-скрипт для имени файла chmod, но только для новых файлов с момента последнего запуска скрипта
  • О выполнении сценария оболочки
  • Есть ли причина, чтобы shebang указывал на / bin / sh, а не / bin / bash?
  • Как распечатать последнее время входа?
  • Когда именно tmpwatch очищает файлы, я помещаю их в / tmp?
  • DNSMasq - разные ответы на конкретные MAC-адреса
  • egrep несколько шаблонов с тире
  • Что такое SELinux ".lst" файлы в / usr / share / selinux / предназначенные для CentOS 7?
  • Установка NFS через systemd в Centos 7
  • Как остановить «Opto Host», взяв порт (Linux)
  • Какие системные журналы могут сказать мне, потерял ли сервер интернет-соединение?
  • php 7 устанавливает броски «Не могу загрузить Zend OPcache - он уже был загружен»
  • Обновление ядра 2.6 до 3.5.3 на CentOS 5.8 -> switchroot: mount failed: нет такого файла или каталога
  • Использование файла электронной почты для записи в / etc / aliases дает ошибки в EL7
  • Конфигурация сервера IPA: нельзя использовать IP-адрес сети
  • Expect script: Как обрабатывать два процесса?
  • Есть ли предел для процессов, которые я могу запустить в фоновом режиме?
  • Поиск информации процесса, связанной с данным портом в HP-UX
  • Как получить счет конкретного процесса с помощью команды ps, а затем сортировать nd считать его пользователем мудрым
  • Как перечислять все процессы linux, которые имели какую-либо сетевую активность в течение определенного периода времени (прошлое или будущее)?
  • Подсчитайте количество процессов и отправьте электронное письмо нескольким людям, если оно превышает определенный предел
  • Как запустить несколько «последовательных» процессов под управлением, учитывая доступные процессоры?
  • Родитель, перезапущенный дочерним элементом, не отвечает на CTRL-C
  • убить группу процессов с отрицательным PID
  • Когда система отправляет SIGTERM в процесс?
  • Почему скорость невзаимодействующих процессов, зависящих от памяти, зависит от того, сколько работает (и как исправить)?
  • Значение @ 0 в сценарии оболочки

    Я смотрел скрипт /etc/init.d/sudo в моей Linux-системе Ubuntu 14.04. При чтении сценария я нашел следующее утверждение:

     find /var/lib/sudo -exec touch -d @0 '{}' \; 

    В чем смысл @0 здесь? Что делает вышеуказанное утверждение?

    3 Solutions collect form web for “Значение @ 0 в сценарии оболочки”

    Это не имеет никакого отношения к bash или sudo . Команда find использует действие -exec для запуска данной команды для каждого найденного файла. В этом случае выполняется команда

     touch -d @0 

    Если вы проверите man touch на системе GNU, вы обнаружите, что

      -d, --date=STRING parse STRING and use it instead of current time 

    Таким образом, -d – это способ выбора даты, которую вы хотите установить, для установки целевого файла. @ Сообщает о touch GNU, что это дата, определенная как секунды с эпохи . Поскольку это фактически 0 секунд, это означает начало самого UNIX-времени. Простой способ проверить это – дать ту же дату команде date GNU:

     $ TZ=UTC date -d @0 Thu Jan 1 00:00:00 UTC 1970 

    Итак, команда, которую вы указали, найдет все файлы и каталоги в /var/lib/sudo и установит их последнюю измененную дату в 00:00 UTC в четверг января, в начале 1970 года.


    Причина, по которой эта линия существует, была хорошо объяснена в комментариях ниже:

    @crisron Целью этой строки является обеспечение того, чтобы все пароли sudo из любого предыдущего экземпляра sudo истекли. В первый раз, когда пользователь запускает sudo, для каждого сеанса он создаст файл в этом каталоге. Затем Sudo проверяет метку времени на файл при следующем запуске, чтобы решить, нужно ли снова запрашивать пароль. Эта строка гарантирует, что при перезапуске демона sudo все пароли должны быть переустановлены в следующий раз, когда пользователь начнет что-то делать. – krowe

    Эта строка делает следующее:

    / var / lib / sudo определяет рабочий каталог.

    -exec touch -d @ 0 '{}' \; это действие для выполнения. Давайте разделим его на части:

    -exec предшествует действию.

    touch -d изменяет временные метки файла, анализируя строку аргумента и используя ее вместо текущего времени.

    @ 0 – это метка времени, которая эквивалентна:

     root@debian:/var/log# date -d @0 Wed Dec 31 21:00:00 ART 1969 

    Итак, нижняя строка:

    Когда команда find найдет удар, обновите временную метку до Сре 31 декабря 21:00:00 ART 1969.

    Надеюсь, поможет.

    @0 – дата эпохи. И, как правило, @x составляет x секунд после эпохи. Например:

     $ touch -d @0 foo $ TZ=UTC ls -l foo -rw-r--r-- 1 vinc17 vinc17 0 1970-01-01 00:00:00 foo 

    Примечание. Параметр -d утилиты touch задается POSIX, но только с строками в формах ISO8601 . Другие формы строк специфичны для каждой реализации, и, в частности, форма @x является расширением GNU.

  • Сценарий Bash не заменяет переменную как ожидалось
  • Сценарий оболочки для проверки состояния точки монтирования на сервере linux
  • Выполнение команды на разных оболочках
  • sh + как использовать массив в sh-скрипте для печати всех значений в массиве
  • скрипт командной строки gnome-open
  • Shell Script - перенаправленный вывод в файл и результаты не ожидаются в первом запуске
  • Как именно «до $ @» работает в сценариях bash?
  • Сценарий Bash для scp-интерпретации тильды (~) слишком рано
  • проверка данных в столбцах, когда данные или некоторые могут отсутствовать или присутствовать?
  • Почему мой скрипт не выполняется на if.up
  • Выход из командной строки Memoizing / caching
  • Как я могу использовать sed для удаления первого абзаца файла?
  • Как искать слово, сохраненное в пространстве удержания с помощью sed?
  • Печатать текст между (и включая) двумя разделителями по строке
  • sed - заменить строку содержимым файла
  • Заменить символ, кроме последних x входов
  • sed для удаления ведущего 91, если число равно 12 цифрам
  • Отдельные «дублированные строки» по пустой строке
  • sed + удалить слово из определенной строки
  • Как извлечь определенные поля из строк с помощью команд оболочки?
  • Распечатайте строку только в том случае, если следующая строка НЕ ​​содержит определенное совпадение
  • Заменить сложную строку в нескольких файлах
  • Что такое / proc / dma? Это только для старой поддержки?
  • Как узнать, что находится в сеансе
  • Как скрывать на Arch Linux вручную?
  • Почему процесс двоичного файла с разрешением только на выполнение остается скрытым в «ps» при использовании hidepid = 2, если пользователь не является root?
  • файлы в / proc / $ PID (например, ssh-agent, Chrome) не принадлежат пользователю, а root
  • Получить нагрузку на процессор ядра в сценарии оболочки
  • Измените «Мягкий предел» «Максимальных процессов»
  • Как Linux читает «реальные файлы» и «виртуальные файлы»?
  • Восстановить от faking / proc / meminfo
  • идентификатор / идентификатор процесса анализа из / proc, идентификаторы потоков
  • Как узнать, что я могу сделать с / proc и / sys
  • Поведение команды `du` с флагом` -L`
  • Как отношение / dev / fd относится к / proc / self / fd /?
  • Определение, является ли файл жесткой ссылкой или символической ссылкой?
  • Создать ссылку между двумя существующими файлами
  • Почему символические ссылки не имеют блоков данных, выделенных им в ext4fs?
  • Почему ln -s скопировал файл, а не связал его?
  • tomcat: символическая ссылка в цикле
  • Если символическая ссылка на NFS указывает на локальный диск, будет ли потерян локальный диск?
  • linux как cd к родительской папке, если она перемещается через символическую ссылку
  • Как удалить символические ссылки, указывающие на файлы в определенной папке?
  • symlink / home / username / Documenten tot 2nd partition?
  • Как извлечь определенные элементы из имени файла?
  • Имена файлов каталогов с sed с пробелами
  • Элементы списка с пробелами в zsh
  • Внутреннее расширение с помощью команды find и символа подстановки
  • Что означает «//» взамен от `which`
  • `/ proc / $ PID / cwd`: есть ли эквивалент POSIX?
  • Почему моя программа «set» не выполняется?
  • Как отображать «доступные для человека» размеры файлов в результатах поиска?
  • Как выполнить инструкцию IF из результата выполненной команды
  • Почему «while .. read .. << EOL» выполняет расширение переменной, но <файл и | не?
  • Как я могу запустить `watch` в качестве фоновой работы?
  • Где $ _ определяется POSIX?
  • ссылочная переменная оболочки $ COLUMNS из сценария bash
  • Преобразование рабочей команды в файл сценария оболочки, который получает аргументы
  • Как запустить скрипт bash из сценария sh (dash)?
  • Как программно отключить пользователя ssh?
  • как разрешить sudo fork bash вместо sh?
  • Вернитесь в каталог до cd-ing в домашний каталог
  • shell-скрипт для имени файла chmod, но только для новых файлов с момента последнего запуска скрипта
  • О выполнении сценария оболочки
  • Есть ли причина, чтобы shebang указывал на / bin / sh, а не / bin / bash?
  • Как распечатать последнее время входа?
  • Когда именно tmpwatch очищает файлы, я помещаю их в / tmp?
  • DNSMasq - разные ответы на конкретные MAC-адреса
  • egrep несколько шаблонов с тире
  • Что такое SELinux ".lst" файлы в / usr / share / selinux / предназначенные для CentOS 7?
  • Установка NFS через systemd в Centos 7
  • Как остановить «Opto Host», взяв порт (Linux)
  • Какие системные журналы могут сказать мне, потерял ли сервер интернет-соединение?
  • php 7 устанавливает броски «Не могу загрузить Zend OPcache - он уже был загружен»
  • Обновление ядра 2.6 до 3.5.3 на CentOS 5.8 -> switchroot: mount failed: нет такого файла или каталога
  • Использование файла электронной почты для записи в / etc / aliases дает ошибки в EL7
  • Конфигурация сервера IPA: нельзя использовать IP-адрес сети
  • Expect script: Как обрабатывать два процесса?
  • Есть ли предел для процессов, которые я могу запустить в фоновом режиме?
  • Поиск информации процесса, связанной с данным портом в HP-UX
  • Как получить счет конкретного процесса с помощью команды ps, а затем сортировать nd считать его пользователем мудрым
  • Как перечислять все процессы linux, которые имели какую-либо сетевую активность в течение определенного периода времени (прошлое или будущее)?
  • Подсчитайте количество процессов и отправьте электронное письмо нескольким людям, если оно превышает определенный предел
  • Как запустить несколько «последовательных» процессов под управлением, учитывая доступные процессоры?
  • Родитель, перезапущенный дочерним элементом, не отвечает на CTRL-C
  • убить группу процессов с отрицательным PID
  • Когда система отправляет SIGTERM в процесс?
  • Почему скорость невзаимодействующих процессов, зависящих от памяти, зависит от того, сколько работает (и как исправить)?
  • Как перенаправить вывод из команды find (использующей grep) в файл журнала?
  • Как «find -exec» передает имена файлов с пробелами?
  • Odd alias "find. -name '* \! {*} *' -ls "в Unix Power Tools
  • find: ничего не делать, если файлы не указаны
  • Извлечь имя файла из команды find
  • Как удалить каталоги на основе вывода `find`?
  • Запуск find & grep и включение пути в выходной файл
  • Правильно установить бит выполнения на основе типа файла?
  • Найти файлы, которые не находятся в .gitignore
  • Список папок, содержащих более X изображений
  • как найти файлы на основе диапазона имен файлов?
  • Почему $ '\ 0' совпадает с ''?

    Обычный способ сделать что-то с несколькими файлами – и не ударил меня за это:

    for f in $(ls); do … 

    Теперь, чтобы быть в безопасности от файлов с пробелами или другими странными символами, наивный способ:

     find . -type f -print0 | while IFS= read -r -d '' file; … 

    Здесь -d '' является коротким для установки ASCII NUL, как в -d $'\0' .

    Но почему это так? Почему '' и $'\0' одинаковы? Это связано с корнями C Bash с пустой строкой, всегда заканчивающейся нулью?

    2 Solutions collect form web for “Почему $ '\ 0' совпадает с ''?”

    man page of bash гласит:

      -d delim The first character of delim is used to terminate the input line, rather than newline. 

    Поскольку строки обычно имеют нулевой конец, первым символом пустой строки является нулевой байт. – Имеет смысл для меня. 🙂

    Источник читает:

     static unsigned char delim; [...] case 'd': delim = *list_optarg; break; 

    Для пустой строки delim это просто нулевой байт.

    Есть два недостатка в bash, которые компенсируют друг друга.

    Когда вы пишете $'\0' , это внутренне обрабатывается одинаково с пустой строкой. Например:

     $ a=$'\0'; echo ${#a} 0 

    Это потому, что внутри bash хранит все строки как строки C , которые заканчиваются на нуль – нулевой байт отмечает конец строки. Bash молча усекает строку до первого нулевого байта (который не является частью строки!).

     # a=$'foo\0bar'; echo "$a"; echo ${#a} foo 3 

    Когда вы передаете строку в качестве аргумента опции -d встроенного read , bash смотрит только на первый байт строки. Но на самом деле он не проверяет, что строка не пуста. Внутри пустая строка представляется в виде массива с 1 элементом, который содержит только нулевой байт. Поэтому вместо чтения первого байта строки bash читает этот нулевой байт.

    Затем, внутренне, механизм, стоящий за встроенным read хорошо работает с нулевыми байтами; он продолжает чтение байта байтом, пока не найдет разделитель.

    Другие оболочки ведут себя по-разному. Например, ash и ksh игнорируют нулевые байты при чтении ввода. С ksh, ksh -d "" читается до новой строки. Корпуса предназначены для того, чтобы хорошо справляться с текстом, а не с двоичными данными. Zsh является исключением: он использует строковое представление, которое обрабатывает произвольные байты, включая нулевые байты; в zsh, $'\0' является строкой длины 1 (но read -d '' , как ни странно, ведет себя как read -d $'\0' ).

  • Сценарий Bash не заменяет переменную как ожидалось
  • Сценарий оболочки для проверки состояния точки монтирования на сервере linux
  • Выполнение команды на разных оболочках
  • sh + как использовать массив в sh-скрипте для печати всех значений в массиве
  • скрипт командной строки gnome-open
  • Shell Script - перенаправленный вывод в файл и результаты не ожидаются в первом запуске
  • Как именно «до $ @» работает в сценариях bash?
  • Сценарий Bash для scp-интерпретации тильды (~) слишком рано
  • проверка данных в столбцах, когда данные или некоторые могут отсутствовать или присутствовать?
  • Почему мой скрипт не выполняется на if.up
  • Выход из командной строки Memoizing / caching
  • Как я могу использовать sed для удаления первого абзаца файла?
  • Как искать слово, сохраненное в пространстве удержания с помощью sed?
  • Печатать текст между (и включая) двумя разделителями по строке
  • sed - заменить строку содержимым файла
  • Заменить символ, кроме последних x входов
  • sed для удаления ведущего 91, если число равно 12 цифрам
  • Отдельные «дублированные строки» по пустой строке
  • sed + удалить слово из определенной строки
  • Как извлечь определенные поля из строк с помощью команд оболочки?
  • Распечатайте строку только в том случае, если следующая строка НЕ ​​содержит определенное совпадение
  • Заменить сложную строку в нескольких файлах
  • Что такое / proc / dma? Это только для старой поддержки?
  • Как узнать, что находится в сеансе
  • Как скрывать на Arch Linux вручную?
  • Почему процесс двоичного файла с разрешением только на выполнение остается скрытым в «ps» при использовании hidepid = 2, если пользователь не является root?
  • файлы в / proc / $ PID (например, ssh-agent, Chrome) не принадлежат пользователю, а root
  • Получить нагрузку на процессор ядра в сценарии оболочки
  • Измените «Мягкий предел» «Максимальных процессов»
  • Как Linux читает «реальные файлы» и «виртуальные файлы»?
  • Восстановить от faking / proc / meminfo
  • идентификатор / идентификатор процесса анализа из / proc, идентификаторы потоков
  • Как узнать, что я могу сделать с / proc и / sys
  • Поведение команды `du` с флагом` -L`
  • Как отношение / dev / fd относится к / proc / self / fd /?
  • Определение, является ли файл жесткой ссылкой или символической ссылкой?
  • Создать ссылку между двумя существующими файлами
  • Почему символические ссылки не имеют блоков данных, выделенных им в ext4fs?
  • Почему ln -s скопировал файл, а не связал его?
  • tomcat: символическая ссылка в цикле
  • Если символическая ссылка на NFS указывает на локальный диск, будет ли потерян локальный диск?
  • linux как cd к родительской папке, если она перемещается через символическую ссылку
  • Как удалить символические ссылки, указывающие на файлы в определенной папке?
  • symlink / home / username / Documenten tot 2nd partition?
  • Как извлечь определенные элементы из имени файла?
  • Имена файлов каталогов с sed с пробелами
  • Элементы списка с пробелами в zsh
  • Внутреннее расширение с помощью команды find и символа подстановки
  • Что означает «//» взамен от `which`
  • `/ proc / $ PID / cwd`: есть ли эквивалент POSIX?
  • Почему моя программа «set» не выполняется?
  • Как отображать «доступные для человека» размеры файлов в результатах поиска?
  • Как выполнить инструкцию IF из результата выполненной команды
  • Почему «while .. read .. << EOL» выполняет расширение переменной, но <файл и | не?
  • Как я могу запустить `watch` в качестве фоновой работы?
  • Где $ _ определяется POSIX?
  • ссылочная переменная оболочки $ COLUMNS из сценария bash
  • Преобразование рабочей команды в файл сценария оболочки, который получает аргументы
  • Как запустить скрипт bash из сценария sh (dash)?
  • Как программно отключить пользователя ssh?
  • как разрешить sudo fork bash вместо sh?
  • Вернитесь в каталог до cd-ing в домашний каталог
  • shell-скрипт для имени файла chmod, но только для новых файлов с момента последнего запуска скрипта
  • О выполнении сценария оболочки
  • Есть ли причина, чтобы shebang указывал на / bin / sh, а не / bin / bash?
  • Как распечатать последнее время входа?
  • Когда именно tmpwatch очищает файлы, я помещаю их в / tmp?
  • DNSMasq - разные ответы на конкретные MAC-адреса
  • egrep несколько шаблонов с тире
  • Что такое SELinux ".lst" файлы в / usr / share / selinux / предназначенные для CentOS 7?
  • Установка NFS через systemd в Centos 7
  • Как остановить «Opto Host», взяв порт (Linux)
  • Какие системные журналы могут сказать мне, потерял ли сервер интернет-соединение?
  • php 7 устанавливает броски «Не могу загрузить Zend OPcache - он уже был загружен»
  • Обновление ядра 2.6 до 3.5.3 на CentOS 5.8 -> switchroot: mount failed: нет такого файла или каталога
  • Использование файла электронной почты для записи в / etc / aliases дает ошибки в EL7
  • Конфигурация сервера IPA: нельзя использовать IP-адрес сети
  • Expect script: Как обрабатывать два процесса?
  • Есть ли предел для процессов, которые я могу запустить в фоновом режиме?
  • Поиск информации процесса, связанной с данным портом в HP-UX
  • Как получить счет конкретного процесса с помощью команды ps, а затем сортировать nd считать его пользователем мудрым
  • Как перечислять все процессы linux, которые имели какую-либо сетевую активность в течение определенного периода времени (прошлое или будущее)?
  • Подсчитайте количество процессов и отправьте электронное письмо нескольким людям, если оно превышает определенный предел
  • Как запустить несколько «последовательных» процессов под управлением, учитывая доступные процессоры?
  • Родитель, перезапущенный дочерним элементом, не отвечает на CTRL-C
  • убить группу процессов с отрицательным PID
  • Когда система отправляет SIGTERM в процесс?
  • Почему скорость невзаимодействующих процессов, зависящих от памяти, зависит от того, сколько работает (и как исправить)?
  • Как перенаправить вывод из команды find (использующей grep) в файл журнала?
  • Как «find -exec» передает имена файлов с пробелами?
  • Odd alias "find. -name '* \! {*} *' -ls "в Unix Power Tools
  • find: ничего не делать, если файлы не указаны
  • Извлечь имя файла из команды find
  • Как удалить каталоги на основе вывода `find`?
  • Запуск find & grep и включение пути в выходной файл
  • Правильно установить бит выполнения на основе типа файла?
  • Найти файлы, которые не находятся в .gitignore
  • Список папок, содержащих более X изображений
  • как найти файлы на основе диапазона имен файлов?
  • Bash -c с позиционными параметрами
  • Какое время выдает «раз»?
  • Как перебрать каталоги и очистить скрипт bash
  • Multi заявление, если условие в bash
  • Как я могу ссылаться на все файлы, включая скрытые файлы?
  • Использование! в расширении параметра
  • Как выполнить команду 'clear' bash перед выполнением любой другой команды?
  • Установить переменную для расширения до явной пустой строки?
  • Bash выполняет переменное расширение строки
  • Пример добавления
  • Предоставить перенаправление на команды, используемые в составных командах
  • Как разделить переменную $ 0, чтобы найти каталог и относительные пути в bash?

    Переменная $ 0 содержит информацию о пути для скрипта.

    • Как я могу изменить информацию о пути в абсолютный путь? Я имею в виду, как обрабатывать ~,., .. или подобное?
    • Как я могу разделить информацию о пути в каталог и имя файла?

    Я мог бы использовать python / perl для этого, но я хочу использовать bash, если это возможно.

    3 Solutions collect form web for “Как разделить переменную $ 0, чтобы найти каталог и относительные пути в bash?”

    Вам не нужно обрабатывать такие вещи, как ~ , оболочка делает это за вас. Вот почему вы можете передавать ~/filename в любой скрипт или программу, и это работает – все эти программы сами не обрабатывают ~ , ваша оболочка преобразует аргумент в /home/username/filename и передает это вместо программы:

     $ echo ~/filename /home/mrozekma/filename 

    Если вам нужно каноническое имя файла (в котором нет таких вещей, как .. ), используйте realpath (спасибо Neil ):

     $ realpath ~/../filename /home/filename 

    Что касается разделения пути на имя каталога и имя файла, используйте dirname и basename :

     $ dirname /foo/bar/baz /foo/bar $ basename /foo/bar/baz baz 

    Использование dirname и basename, как упомянуто Майклом, должно быть самым безопасным способом получить то, что вы хотите.

    В любом случае, если вы действительно хотите сделать это с помощью инструментов «bash only», вы можете использовать подстановку параметров:

     echo `basename $PWD` # Basename of current working directory. echo "${PWD##*/}" # Basename of current working directory. echo echo `basename $0` # Name of script. echo $0 # Name of script. echo "${0##*/}" # Name of script. echo filename=test.data echo "${filename##*.}" # data # Extension of filename. 

    Этот пример непосредственно взят из Руководства по разработке сценариев Advanced Bash, которое стоит посмотреть.

    Объяснение довольно просто:

    $ {var # Pattern} Удалить из $ var кратчайшую часть $ Pattern, которая соответствует переднему концу $ var. $ {var ## Pattern} Удалить из $ var самую длинную часть $ Pattern, которая соответствует переднему концу $ var.

    Посмотрите на шаблон как некоторое регулярное выражение, а # или ## как некий жадный / неживой модификатор.

    Это может стать полезным, если вам нужно будет сделать еще более сложные извлечения части пути.

    realpath – это команда, которая сообщает вам реальный путь (удаляет .. и символические ссылки и т. д.),

    Он является стандартным для FreeBSD. Согласно этому обсуждению, он также доступен для Linux:

    http://www.unix.com/shell-programming-scripting/89294-geting-real-path.html

    Это обсуждение также предлагает решение bash:

     $ bash -c "cd /foo/../bar/ ; pwd" 
  • Сценарий Bash не заменяет переменную как ожидалось
  • Сценарий оболочки для проверки состояния точки монтирования на сервере linux
  • Выполнение команды на разных оболочках
  • sh + как использовать массив в sh-скрипте для печати всех значений в массиве
  • скрипт командной строки gnome-open
  • Shell Script - перенаправленный вывод в файл и результаты не ожидаются в первом запуске
  • Как именно «до $ @» работает в сценариях bash?
  • Сценарий Bash для scp-интерпретации тильды (~) слишком рано
  • проверка данных в столбцах, когда данные или некоторые могут отсутствовать или присутствовать?
  • Почему мой скрипт не выполняется на if.up
  • Выход из командной строки Memoizing / caching
  • Как я могу использовать sed для удаления первого абзаца файла?
  • Как искать слово, сохраненное в пространстве удержания с помощью sed?
  • Печатать текст между (и включая) двумя разделителями по строке
  • sed - заменить строку содержимым файла
  • Заменить символ, кроме последних x входов
  • sed для удаления ведущего 91, если число равно 12 цифрам
  • Отдельные «дублированные строки» по пустой строке
  • sed + удалить слово из определенной строки
  • Как извлечь определенные поля из строк с помощью команд оболочки?
  • Распечатайте строку только в том случае, если следующая строка НЕ ​​содержит определенное совпадение
  • Заменить сложную строку в нескольких файлах
  • Что такое / proc / dma? Это только для старой поддержки?
  • Как узнать, что находится в сеансе
  • Как скрывать на Arch Linux вручную?
  • Почему процесс двоичного файла с разрешением только на выполнение остается скрытым в «ps» при использовании hidepid = 2, если пользователь не является root?
  • файлы в / proc / $ PID (например, ssh-agent, Chrome) не принадлежат пользователю, а root
  • Получить нагрузку на процессор ядра в сценарии оболочки
  • Измените «Мягкий предел» «Максимальных процессов»
  • Как Linux читает «реальные файлы» и «виртуальные файлы»?
  • Восстановить от faking / proc / meminfo
  • идентификатор / идентификатор процесса анализа из / proc, идентификаторы потоков
  • Как узнать, что я могу сделать с / proc и / sys
  • Поведение команды `du` с флагом` -L`
  • Как отношение / dev / fd относится к / proc / self / fd /?
  • Определение, является ли файл жесткой ссылкой или символической ссылкой?
  • Создать ссылку между двумя существующими файлами
  • Почему символические ссылки не имеют блоков данных, выделенных им в ext4fs?
  • Почему ln -s скопировал файл, а не связал его?
  • tomcat: символическая ссылка в цикле
  • Если символическая ссылка на NFS указывает на локальный диск, будет ли потерян локальный диск?
  • linux как cd к родительской папке, если она перемещается через символическую ссылку
  • Как удалить символические ссылки, указывающие на файлы в определенной папке?
  • symlink / home / username / Documenten tot 2nd partition?
  • Как извлечь определенные элементы из имени файла?
  • Имена файлов каталогов с sed с пробелами
  • Элементы списка с пробелами в zsh
  • Внутреннее расширение с помощью команды find и символа подстановки
  • Что означает «//» взамен от `which`
  • `/ proc / $ PID / cwd`: есть ли эквивалент POSIX?
  • Почему моя программа «set» не выполняется?
  • Как отображать «доступные для человека» размеры файлов в результатах поиска?
  • Как выполнить инструкцию IF из результата выполненной команды
  • Почему «while .. read .. << EOL» выполняет расширение переменной, но <файл и | не?
  • Как я могу запустить `watch` в качестве фоновой работы?
  • Где $ _ определяется POSIX?
  • ссылочная переменная оболочки $ COLUMNS из сценария bash
  • Преобразование рабочей команды в файл сценария оболочки, который получает аргументы
  • Как запустить скрипт bash из сценария sh (dash)?
  • Как программно отключить пользователя ssh?
  • как разрешить sudo fork bash вместо sh?
  • Вернитесь в каталог до cd-ing в домашний каталог
  • shell-скрипт для имени файла chmod, но только для новых файлов с момента последнего запуска скрипта
  • О выполнении сценария оболочки
  • Есть ли причина, чтобы shebang указывал на / bin / sh, а не / bin / bash?
  • Как распечатать последнее время входа?
  • Когда именно tmpwatch очищает файлы, я помещаю их в / tmp?
  • DNSMasq - разные ответы на конкретные MAC-адреса
  • egrep несколько шаблонов с тире
  • Что такое SELinux ".lst" файлы в / usr / share / selinux / предназначенные для CentOS 7?
  • Установка NFS через systemd в Centos 7
  • Как остановить «Opto Host», взяв порт (Linux)
  • Какие системные журналы могут сказать мне, потерял ли сервер интернет-соединение?
  • php 7 устанавливает броски «Не могу загрузить Zend OPcache - он уже был загружен»
  • Обновление ядра 2.6 до 3.5.3 на CentOS 5.8 -> switchroot: mount failed: нет такого файла или каталога
  • Использование файла электронной почты для записи в / etc / aliases дает ошибки в EL7
  • Конфигурация сервера IPA: нельзя использовать IP-адрес сети
  • Expect script: Как обрабатывать два процесса?
  • Есть ли предел для процессов, которые я могу запустить в фоновом режиме?
  • Поиск информации процесса, связанной с данным портом в HP-UX
  • Как получить счет конкретного процесса с помощью команды ps, а затем сортировать nd считать его пользователем мудрым
  • Как перечислять все процессы linux, которые имели какую-либо сетевую активность в течение определенного периода времени (прошлое или будущее)?
  • Подсчитайте количество процессов и отправьте электронное письмо нескольким людям, если оно превышает определенный предел
  • Как запустить несколько «последовательных» процессов под управлением, учитывая доступные процессоры?
  • Родитель, перезапущенный дочерним элементом, не отвечает на CTRL-C
  • убить группу процессов с отрицательным PID
  • Когда система отправляет SIGTERM в процесс?
  • Почему скорость невзаимодействующих процессов, зависящих от памяти, зависит от того, сколько работает (и как исправить)?
  • Как перенаправить вывод из команды find (использующей grep) в файл журнала?
  • Как «find -exec» передает имена файлов с пробелами?
  • Odd alias "find. -name '* \! {*} *' -ls "в Unix Power Tools
  • find: ничего не делать, если файлы не указаны
  • Извлечь имя файла из команды find
  • Как удалить каталоги на основе вывода `find`?
  • Запуск find & grep и включение пути в выходной файл
  • Правильно установить бит выполнения на основе типа файла?
  • Найти файлы, которые не находятся в .gitignore
  • Список папок, содержащих более X изображений
  • как найти файлы на основе диапазона имен файлов?
  • Bash -c с позиционными параметрами
  • Какое время выдает «раз»?
  • Как перебрать каталоги и очистить скрипт bash
  • Multi заявление, если условие в bash
  • Как я могу ссылаться на все файлы, включая скрытые файлы?
  • Использование! в расширении параметра
  • Как выполнить команду 'clear' bash перед выполнением любой другой команды?
  • Установить переменную для расширения до явной пустой строки?
  • Bash выполняет переменное расширение строки
  • Пример добавления
  • Предоставить перенаправление на команды, используемые в составных командах
  • Linux: Как обновить ssh-keygen?
  • Расширение имени файла для печати с помощью -exec в поиске
  • Сводка синтаксиса команд в стандартном человеческом формате
  • $ * переменная функции zsh приводит к неожиданным результатам
  • найти с -exec eval $ 0
  • Преобразование позиционных аргументов сценария оболочки
  • Кажется, что расширение параметра отсутствует
  • как правильно передать _set_ параметров с пробелами в функцию оболочки
  • Как назначить значение входной переменной в оболочке
  • Как вы можете передавать параметры для работы в скрипте?
  • Индексирование и изменение массива параметров Bash $ @
  • Был ли «\ 0» в конце каждого скрипта?

    Мне интересно, как вы закончили конец скрипта / файла? Меня особенно интересуют старые версии Unix (например, V6).

    Есть ли «\ 0» после последнего написанного символа?

    2 Solutions collect form web for “Был ли «\ 0» в конце каждого скрипта?”

    Программы Userland в еще более ранних Unix-системах не отображали байты «pad» в конце файла. Я знаю, что MS-DOS или CP / M будут заполнять блоки дисков символами Ctrl-Z, поэтому не только алгоритм чтения файлов должен был проверять на наличие блоков конца диска, но и проверять байты заполнения.

    Unixes никогда такого не делал. Программы читают байты до тех пор, пока не произойдет условие конца файла, которое для системного вызова read(2) означает возврат 0. К сожалению, долговременный системный вызов может быть прерван, что приводит к тому, что read() возвращает код ошибки (-1 ), а глобальный символ errno оценивает EINTR, поэтому Unixes также традиционно вводят некоторую глупость в чтение некоторых устройств.

    Для всего этого существует аспект файловой системы: файловые системы Unix помещают данные в блоки диска и сохраняют значение размера файла в байтах inode. Некоторые другие ОС только сохраняли размер файла в блоках. Если данные были меньшими, чем блок, проблема переросла в пользовательскую область, с байтами пропусков или с другой глупостью.

    Не обязательно. Интерпретатор оболочки считывает файл с помощью скрипта с использованием некоторой (более или менее сложной) оболочки syscall (например, read() для fread() ), которая будет сигнализировать о состоянии конца файла, когда он достигнет последнего байта файла ( который не должен быть равен нулю).

  • Сценарий Bash не заменяет переменную как ожидалось
  • Сценарий оболочки для проверки состояния точки монтирования на сервере linux
  • Выполнение команды на разных оболочках
  • sh + как использовать массив в sh-скрипте для печати всех значений в массиве
  • скрипт командной строки gnome-open
  • Shell Script - перенаправленный вывод в файл и результаты не ожидаются в первом запуске
  • Как именно «до $ @» работает в сценариях bash?
  • Сценарий Bash для scp-интерпретации тильды (~) слишком рано
  • проверка данных в столбцах, когда данные или некоторые могут отсутствовать или присутствовать?
  • Почему мой скрипт не выполняется на if.up
  • Выход из командной строки Memoizing / caching
  • Как я могу использовать sed для удаления первого абзаца файла?
  • Как искать слово, сохраненное в пространстве удержания с помощью sed?
  • Печатать текст между (и включая) двумя разделителями по строке
  • sed - заменить строку содержимым файла
  • Заменить символ, кроме последних x входов
  • sed для удаления ведущего 91, если число равно 12 цифрам
  • Отдельные «дублированные строки» по пустой строке
  • sed + удалить слово из определенной строки
  • Как извлечь определенные поля из строк с помощью команд оболочки?
  • Распечатайте строку только в том случае, если следующая строка НЕ ​​содержит определенное совпадение
  • Заменить сложную строку в нескольких файлах
  • Что такое / proc / dma? Это только для старой поддержки?
  • Как узнать, что находится в сеансе
  • Как скрывать на Arch Linux вручную?
  • Почему процесс двоичного файла с разрешением только на выполнение остается скрытым в «ps» при использовании hidepid = 2, если пользователь не является root?
  • файлы в / proc / $ PID (например, ssh-agent, Chrome) не принадлежат пользователю, а root
  • Получить нагрузку на процессор ядра в сценарии оболочки
  • Измените «Мягкий предел» «Максимальных процессов»
  • Как Linux читает «реальные файлы» и «виртуальные файлы»?
  • Восстановить от faking / proc / meminfo
  • идентификатор / идентификатор процесса анализа из / proc, идентификаторы потоков
  • Как узнать, что я могу сделать с / proc и / sys
  • Поведение команды `du` с флагом` -L`
  • Как отношение / dev / fd относится к / proc / self / fd /?
  • Определение, является ли файл жесткой ссылкой или символической ссылкой?
  • Создать ссылку между двумя существующими файлами
  • Почему символические ссылки не имеют блоков данных, выделенных им в ext4fs?
  • Почему ln -s скопировал файл, а не связал его?
  • tomcat: символическая ссылка в цикле
  • Если символическая ссылка на NFS указывает на локальный диск, будет ли потерян локальный диск?
  • linux как cd к родительской папке, если она перемещается через символическую ссылку
  • Как удалить символические ссылки, указывающие на файлы в определенной папке?
  • symlink / home / username / Documenten tot 2nd partition?
  • Как извлечь определенные элементы из имени файла?
  • Имена файлов каталогов с sed с пробелами
  • Элементы списка с пробелами в zsh
  • Внутреннее расширение с помощью команды find и символа подстановки
  • Что означает «//» взамен от `which`
  • `/ proc / $ PID / cwd`: есть ли эквивалент POSIX?
  • Почему моя программа «set» не выполняется?
  • Как отображать «доступные для человека» размеры файлов в результатах поиска?
  • Как выполнить инструкцию IF из результата выполненной команды
  • Почему «while .. read .. << EOL» выполняет расширение переменной, но <файл и | не?
  • Как я могу запустить `watch` в качестве фоновой работы?
  • Где $ _ определяется POSIX?
  • ссылочная переменная оболочки $ COLUMNS из сценария bash
  • Преобразование рабочей команды в файл сценария оболочки, который получает аргументы
  • Как запустить скрипт bash из сценария sh (dash)?
  • Как программно отключить пользователя ssh?
  • как разрешить sudo fork bash вместо sh?
  • Вернитесь в каталог до cd-ing в домашний каталог
  • shell-скрипт для имени файла chmod, но только для новых файлов с момента последнего запуска скрипта
  • О выполнении сценария оболочки
  • Есть ли причина, чтобы shebang указывал на / bin / sh, а не / bin / bash?
  • Как распечатать последнее время входа?
  • Когда именно tmpwatch очищает файлы, я помещаю их в / tmp?
  • DNSMasq - разные ответы на конкретные MAC-адреса
  • egrep несколько шаблонов с тире
  • Что такое SELinux ".lst" файлы в / usr / share / selinux / предназначенные для CentOS 7?
  • Установка NFS через systemd в Centos 7
  • Как остановить «Opto Host», взяв порт (Linux)
  • Какие системные журналы могут сказать мне, потерял ли сервер интернет-соединение?
  • php 7 устанавливает броски «Не могу загрузить Zend OPcache - он уже был загружен»
  • Обновление ядра 2.6 до 3.5.3 на CentOS 5.8 -> switchroot: mount failed: нет такого файла или каталога
  • Использование файла электронной почты для записи в / etc / aliases дает ошибки в EL7
  • Конфигурация сервера IPA: нельзя использовать IP-адрес сети
  • Expect script: Как обрабатывать два процесса?
  • Есть ли предел для процессов, которые я могу запустить в фоновом режиме?
  • Поиск информации процесса, связанной с данным портом в HP-UX
  • Как получить счет конкретного процесса с помощью команды ps, а затем сортировать nd считать его пользователем мудрым
  • Как перечислять все процессы linux, которые имели какую-либо сетевую активность в течение определенного периода времени (прошлое или будущее)?
  • Подсчитайте количество процессов и отправьте электронное письмо нескольким людям, если оно превышает определенный предел
  • Как запустить несколько «последовательных» процессов под управлением, учитывая доступные процессоры?
  • Родитель, перезапущенный дочерним элементом, не отвечает на CTRL-C
  • убить группу процессов с отрицательным PID
  • Когда система отправляет SIGTERM в процесс?
  • Почему скорость невзаимодействующих процессов, зависящих от памяти, зависит от того, сколько работает (и как исправить)?
  • Как перенаправить вывод из команды find (использующей grep) в файл журнала?
  • Как «find -exec» передает имена файлов с пробелами?
  • Odd alias "find. -name '* \! {*} *' -ls "в Unix Power Tools
  • find: ничего не делать, если файлы не указаны
  • Извлечь имя файла из команды find
  • Как удалить каталоги на основе вывода `find`?
  • Запуск find & grep и включение пути в выходной файл
  • Правильно установить бит выполнения на основе типа файла?
  • Найти файлы, которые не находятся в .gitignore
  • Список папок, содержащих более X изображений
  • как найти файлы на основе диапазона имен файлов?
  • Bash -c с позиционными параметрами
  • Какое время выдает «раз»?
  • Как перебрать каталоги и очистить скрипт bash
  • Multi заявление, если условие в bash
  • Как я могу ссылаться на все файлы, включая скрытые файлы?
  • Использование! в расширении параметра
  • Как выполнить команду 'clear' bash перед выполнением любой другой команды?
  • Установить переменную для расширения до явной пустой строки?
  • Bash выполняет переменное расширение строки
  • Пример добавления
  • Предоставить перенаправление на команды, используемые в составных командах
  • Linux: Как обновить ssh-keygen?
  • Расширение имени файла для печати с помощью -exec в поиске
  • Сводка синтаксиса команд в стандартном человеческом формате
  • $ * переменная функции zsh приводит к неожиданным результатам
  • найти с -exec eval $ 0
  • Преобразование позиционных аргументов сценария оболочки
  • Кажется, что расширение параметра отсутствует
  • как правильно передать _set_ параметров с пробелами в функцию оболочки
  • Как назначить значение входной переменной в оболочке
  • Как вы можете передавать параметры для работы в скрипте?
  • Индексирование и изменение массива параметров Bash $ @
  • Загрузите другой .bashrc при запуске консоли или термина из командной строки
  • Ошибка при запуске скрипта PL / SQL
  • Найдите значение в одном столбце и напечатайте соответствующее значение от другого
  • Как получить текущий рабочий каталог перед его заменой
  • Bash: процесс уничтожения в функции используемой памяти
  • Пропустить первую строку (или больше) в CSV-файле, который используется для переименования файлов
  • BASH и поведение возврата каретки
  • Как объединить два файла «на лету» и ссылочный результат как новый файл?
  • Сценарий, который удаляет нежелательные символы из переменной
  • Как отобразить результат df каждые 30 секунд?
  • скрипт для регистрации всех статистических данных для определенного процесса
  • Будет ли $ 0 всегда включать путь к скрипту?

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

    Я думал о чем-то подобном:

    grep '^#h ' -- "$0" | sed -e 's/#h //' 

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

    Я искал объяснение специальных переменных и нашел следующие описания $0 :

    • имя текущей оболочки или программы

    • filename текущего скрипта

    • имя самого скрипта

    • команда, поскольку она была запущена

    Ни одно из них не дает понять, будет ли значение $0 включать каталог, если скрипт был вызван без него. Последнее на самом деле означает, что это не так.

    Тестирование в моей системе (Bash 4.1)

    Я создал исполняемый файл в / usr / local / bin с именем scriptname с одной строкой echo $0 и вызвал его из разных мест.

    Это мои результаты:

     > cd /usr/local/bin/test > ../scriptname ../scriptname > cd /usr/local/bin > ./scriptname ./scriptname > cd /usr/local > bin/scriptname bin/scriptname > cd /tmp > /usr/local/bin/scriptname /usr/local/bin/scriptname > scriptname /usr/local/bin/scriptname 

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

    Но потом я наткнулся на комментарий о переполнении стека, который смутил меня. Ответ предполагает использовать $(dirname $0) чтобы получить каталог текущего скрипта. Комментарий (в 7 раз) говорит, что «это не сработает, если скрипт находится на вашем пути».

    Вопросов

    • Правильно ли этот комментарий?
    • Является ли поведение другим в других системах?
    • Существуют ли ситуации, когда $0 не будет включать каталог?

    7 Solutions collect form web for “Будет ли $ 0 всегда включать путь к скрипту?”

    В наиболее распространенных случаях $0 будет содержать путь, абсолютный или относительный к сценарию, поэтому

     script_path=$(readlink -e -- "$0") 

    (при условии, что есть команда readlink и она поддерживает -e ), как правило, является достаточно хорошим способом получить канонический абсолютный путь к скрипту.

    $0 назначается из аргумента, указывающего скрипт, передаваемый интерпретатору.

    Например, в:

     the-shell -shell-options the/script its args 

    $0 получает the/script .

    Когда вы запускаете:

     the/script its args 

    Ваша оболочка будет делать:

     exec("the/script", ["the/script", "its", "args"]) 

    Если скрипт содержит #! /bin/sh - #! /bin/sh - she-bang, например, система преобразует это значение в:

     exec("/bin/sh", ["/bin/sh" or "the/script", "-", "the/script", "its", "args"]) 

    (если он не содержит she-bang, или, более общо, если система возвращает ошибку ENOEXEC, то ее оболочка будет делать то же самое)

    В некоторых системах существует исключение для скриптов setuid / setgid, где система откроет скрипт на некотором fd x и запустит вместо него:

     exec("/bin/sh", ["/bin/sh" or "the/script", "-", "/dev/fd/x", "its", "args"]) 

    чтобы избежать условий гонки (в этом случае $0 будет содержать /dev/fd/x ).

    Теперь вы можете утверждать, что /dev/fd/x это путь к этому скрипту. Обратите внимание, однако, что если вы читаете от $0 , вы нарушите скрипт, когда будете потреблять входные данные.

    Теперь есть разница, если имя команды сценария, которое вызывается, не содержит косой черты. В:

     the-script its args 

    Ваша оболочка будет искать the-script в $PATH . $PATH может содержать абсолютные или относительные (включая пустую строку) пути к некоторым каталогам. Например, если $PATH содержит /bin:/usr/bin: и the-script находится в текущем каталоге, оболочка будет делать:

     exec("the-script", ["the-script", "its", "args"]) 

    которые станут:

     exec("/bin/sh", ["/bin/sh" or "the-script", "-", "the-script", "its", "args"] 

    Или, если он найден в /usr/bin :

     exec("/usr/bin/the-script", ["the-script", "its", "args"]) exec("/bin/sh", ["/bin/sh" or "the-script" or "/usr/bin/the-script", "-", "/usr/bin/the-script", "its", "args") 

    Во всех случаях выше, кроме квадратного случая setuid, $0 будет содержать путь (абсолютный или относительный) к скрипту.

    Теперь скрипт можно также вызвать как:

     the-interpreter the-script its args 

    Когда the-script как указано выше, не содержит косой черты, поведение немного меняется от оболочки к оболочке.

    Старые реализации AT & T ksh фактически просматривали сценарий безоговорочно в $PATH (который был на самом деле ошибкой и дырой в безопасности для скриптов setuid), поэтому $0 фактически не содержал пути к скрипту, если бы поиск в $PATH самом деле не обнаружил the-script в текущем каталоге.

    Новый AT & T ksh попытается интерпретировать the-script в текущем каталоге, если он доступен для чтения. Если бы это не было, то он мог бы искать читаемый и исполняемый the-script в $PATH .

    Для bash он проверяет, находится ли the-script в текущем каталоге (и не является сломанной символической ссылкой), а если нет, найдите для чтения (не обязательно исполняемый) the-script в $PATH .

    zsh in sh emulation будет делать как bash за исключением того, что если the-script является сломанной символической ссылкой в ​​текущем каталоге, он не будет искать the-script в $PATH и вместо этого сообщает об ошибке.

    Все другие раковины, похожие на Bourne, не выглядят the-script в $PATH .

    В любом случае для всех этих оболочек, если вы обнаружите, что $0 не содержит / и не читается, то, вероятно, он был просмотрен в $PATH . Затем, поскольку файлы в $PATH , вероятно, будут исполняемыми, вероятно, безопасное приближение к использованию command -v -- "$0" для поиска ее пути (хотя это не сработает, если $0 также будет именем оболочки builtin или ключевое слово (в большинстве оболочек)).

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

     progname=$0 [ -r "$progname" ] || progname=$( PATH_terminated=${PATH-$(getconf PATH)}: IFS=:; set -f for i in $PATH_terminated; do case $i in "") p=$progname;; */) p=$i$progname;; *) p=$i/$progname esac [ -r "$p" ] && exec printf '%s\n' "$p" done exit 1 ) && progname=$(readlink -e -- "$progname") || progname=unknown 

    (здесь предполагается оболочка POSIX, где IFS является разделителем полей . Оболочки, такие как zsh (в эмуляции sh ) или более старые pdksh основанные, которые обрабатывают IFS в качестве разделителя полей, будут видеть дополнительный пустой элемент при расщеплении $PATH_terminated ).

    Теперь есть несколько эзотерических способов вызвать скрипт. Можно было:

     the-shell < the-script 

    Или:

     cat the-script | the-shell 

    В этом случае $0 будет первым аргументом ( argv[0] ), который получил интерпретатор (над the-shell , но это может быть что угодно, хотя обычно это либо basename, либо один путь к этому интерпретатору).

    Обнаружение того, что вы находитесь в этой ситуации на основе значения $0 , не является надежным. Вы можете посмотреть вывод ps -o args= -p "$$" чтобы получить подсказку. В случае с трубой нет реального способа вернуться к пути к сценарию.

    Можно также сделать:

     the-shell -c '. the-script' blah blih 

    Тогда, кроме zsh (и некоторой старой реализации оболочки Bourne), $0 будет blah . Снова трудно попасть на путь скрипта в этих оболочках.

    Или:

     the-shell -c "$(cat the-script)" blah blih 

    и т.п.

    Чтобы убедиться, что у вас есть правильная $progname , вы можете найти в ней определенную строку, например:

     progname=$0 [ -r "$progname" ] || progname=$( PATH_terminated=${PATH-$(getconf PATH)}: IFS=:; set -f for i in $PATH_terminated; do case $i in "") p=$progname;; */) p=$i$progname;; *) p=$i/$progname esac [ -r "$p" ] && exec printf '%s\n' "$p" done exit 1 ) && progname=$(readlink -e -- "$progname") || progname=unknown [ -f "$progname" ] && grep -q 7YQLVVD3UIUDTA32LSE8U9UOHH < "$progname" || progname=unknown 

    Но опять же я не думаю, что это стоит усилий.

    Вот две ситуации, когда каталог не будет включен:

     > bash scriptname scriptname > bash <scriptname bash 

    В обоих случаях текущий каталог должен быть каталогом, в котором находилось имя сценария .

    В первом случае значение $0 все равно может быть передано в grep так как предполагается, что аргумент FILE относится к текущему каталогу.

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

    Предостережения

    • Если скрипт изменяет текущий каталог, вы не захотите использовать относительные пути.

    • Если сценарий получен, значение $0 обычно будет сценарием вызывающего абонента, а не сценарием с исходным кодом.

    Нуль произвольного аргумента может быть задан при использовании параметра -c для большинства (всех?) Оболочек. Например:

     sh -c 'echo $0' argv0 

    От man bash (выбирается чисто потому, что у него есть лучшее описание, чем у моего man sh – использование одинаково независимо):

    Если присутствует опция -c, команды считываются из первого аргумента без аргумента command_string. Если после команды command_string есть аргументы, они назначаются позиционным параметрам, начиная с $ 0.

    ПРИМЕЧАНИЕ. Другие уже объяснили механику $0 поэтому я пропущу все это.

    Я вообще делаю эту проблему полностью и просто использую команду readlink -f $0 . Это всегда даст вам полный путь к тому, что вы дадите ему в качестве аргумента.

    Примеры

    Скажем, я здесь, чтобы начать с:

     $ pwd /home/saml/tst/119929/adir 

    Создайте каталог + файл:

     $ mkdir adir $ touch afile $ cd adir/ 

    Теперь начните показывать readlink :

     $ readlink -f ../adir /home/saml/tst/119929/adir $ readlink -f ../ /home/saml/tst/119929 $ readlink -f ../afile /home/saml/tst/119929/afile $ readlink -f . /home/saml/tst/119929/adir 

    Дополнительный обман

    Теперь, когда мы возвращаем согласованный результат при опросе $0 через readlink мы можем использовать просто dirname $(readlink -f $0) чтобы получить абсолютный путь к скрипту -или- basename $(readlink -f $0) чтобы получить фактическое имя сценария.

    Моя страница говорит:

    $0 : расширяется до name shell или shell script .

    Кажется, это переводит в argv[0] текущей оболочки – или первый аргумент командной строки nonoperand, когда интерпретируется текущая интерпретационная оболочка. Ранее я утверждал, что sh ./somescript бы свою переменную $0 $ENV в sh но это было неправильно, потому что shell является новым процессом и вызывается с помощью нового $ENV .

    Таким образом sh ./somescript.sh отличается от . ./somescript.sh . ./somescript.sh который работает в текущей среде и $0 уже установлен.

    Вы можете проверить это, сравнив $0 с /proc/$$/status .

     echo 'script="/proc/$$/status" echo $0 cat "$script"' \ > ./script.sh sh ./script.sh ; . ./script.sh 

    Спасибо за исправление, @toxalot. Я кое-что узнал.

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

    В то время как $0 содержит имя сценария, он может содержать префиксный путь, основанный на способе вызова сценария, я всегда использовал ${0##*/} для печати имени сценария в выводе справки, который удаляет любой ведущий путь из $0 .

    Взято из Advanced Bash Scripting guide – Раздел 10.2 подстановка параметров

    ${var#Pattern}

    Удалите из $var кратчайшую часть $Pattern которая соответствует переднему концу $var .

    ${var##Pattern}

    Удалить из $var самую длинную часть $Pattern которая соответствует переднему концу $var .

    Таким образом, самая длинная часть $0 которая соответствует */ будет полным префиксом пути, возвращая только имя скрипта.

    Для чего-то подобного я использую:

     rPath="$(dirname $(realpath $0))" echo $rPath rPath=$(dirname $(readlink -e -- "$0")) echo $rPath 

    rPath всегда имеет такое же значение.

  • Сценарий Bash не заменяет переменную как ожидалось
  • Сценарий оболочки для проверки состояния точки монтирования на сервере linux
  • Выполнение команды на разных оболочках
  • sh + как использовать массив в sh-скрипте для печати всех значений в массиве
  • скрипт командной строки gnome-open
  • Shell Script - перенаправленный вывод в файл и результаты не ожидаются в первом запуске
  • Как именно «до $ @» работает в сценариях bash?
  • Сценарий Bash для scp-интерпретации тильды (~) слишком рано
  • проверка данных в столбцах, когда данные или некоторые могут отсутствовать или присутствовать?
  • Почему мой скрипт не выполняется на if.up
  • Выход из командной строки Memoizing / caching
  • Как я могу использовать sed для удаления первого абзаца файла?
  • Как искать слово, сохраненное в пространстве удержания с помощью sed?
  • Печатать текст между (и включая) двумя разделителями по строке
  • sed - заменить строку содержимым файла
  • Заменить символ, кроме последних x входов
  • sed для удаления ведущего 91, если число равно 12 цифрам
  • Отдельные «дублированные строки» по пустой строке
  • sed + удалить слово из определенной строки
  • Как извлечь определенные поля из строк с помощью команд оболочки?
  • Распечатайте строку только в том случае, если следующая строка НЕ ​​содержит определенное совпадение
  • Заменить сложную строку в нескольких файлах
  • Что такое / proc / dma? Это только для старой поддержки?
  • Как узнать, что находится в сеансе
  • Как скрывать на Arch Linux вручную?
  • Почему процесс двоичного файла с разрешением только на выполнение остается скрытым в «ps» при использовании hidepid = 2, если пользователь не является root?
  • файлы в / proc / $ PID (например, ssh-agent, Chrome) не принадлежат пользователю, а root
  • Получить нагрузку на процессор ядра в сценарии оболочки
  • Измените «Мягкий предел» «Максимальных процессов»
  • Как Linux читает «реальные файлы» и «виртуальные файлы»?
  • Восстановить от faking / proc / meminfo
  • идентификатор / идентификатор процесса анализа из / proc, идентификаторы потоков
  • Как узнать, что я могу сделать с / proc и / sys
  • Поведение команды `du` с флагом` -L`
  • Как отношение / dev / fd относится к / proc / self / fd /?
  • Определение, является ли файл жесткой ссылкой или символической ссылкой?
  • Создать ссылку между двумя существующими файлами
  • Почему символические ссылки не имеют блоков данных, выделенных им в ext4fs?
  • Почему ln -s скопировал файл, а не связал его?
  • tomcat: символическая ссылка в цикле
  • Если символическая ссылка на NFS указывает на локальный диск, будет ли потерян локальный диск?
  • linux как cd к родительской папке, если она перемещается через символическую ссылку
  • Как удалить символические ссылки, указывающие на файлы в определенной папке?
  • symlink / home / username / Documenten tot 2nd partition?
  • Как извлечь определенные элементы из имени файла?
  • Имена файлов каталогов с sed с пробелами
  • Элементы списка с пробелами в zsh
  • Внутреннее расширение с помощью команды find и символа подстановки
  • Что означает «//» взамен от `which`
  • `/ proc / $ PID / cwd`: есть ли эквивалент POSIX?
  • Почему моя программа «set» не выполняется?
  • Как отображать «доступные для человека» размеры файлов в результатах поиска?
  • Как выполнить инструкцию IF из результата выполненной команды
  • Почему «while .. read .. << EOL» выполняет расширение переменной, но <файл и | не?
  • Как я могу запустить `watch` в качестве фоновой работы?
  • Где $ _ определяется POSIX?
  • ссылочн