Bash (Русский)
Состояние перевода: На этой странице представлен перевод статьи Bash. Дата последней синхронизации: 10 июля 2021. Вы можете помочь синхронизировать перевод, если в английской версии произошли изменения.
Bash (Bourne-again Shell) — командная оболочка/язык программирования проекта GNU. Название представляет собой отсылку к предшественнику, существовавшей некогда командной оболочке Борна (Bourne shell). Bash работает в большинстве UNIX-подобных операционных систем, в том числе и в GNU/Linux.
В Arch Linux Bash является командной оболочкой, используемой по умолчанию.
Запуск
Поведение Bash зависит от способа, каким он был запущен.
Если Bash был вызван в TTY в процессе работы команды login , демоном SSH или другим схожим образом, то он считается оболочкой входа (login shell). Этот режим также можно выбрать флагом -l / —login .
Bash считается интерактивной оболочкой (interactive shell), если его стандартные потоки ввода/вывода/ошибок подключены к терминалу (например, при запуске в эмуляторе терминала), причём запуск выполнялся без опции -c и не с неопциональным аргументом (вроде bash скрипт ). Все интерактивные оболочки при запуске считывают файлы /etc/bash.bashrc и ~/.bashrc , а интерактивные оболочки входа — также /etc/profile и ~/.bash_profile .
Примечание: В Arch исполняемый файл /bin/sh (использовался в оболочке Борна) заменён символической ссылкой на /bin/bash . Если запустить Bash командой sh , то он будет вести себя маскимально приближенно к «настоящему» sh, в том числе и в смысле POSIX-совместимости.
Файлы настроек
В зависимости от способа запуска Bash считывает и исполняет определённый набор файлов. Подробнее см. раздел Bash Startup Files справочного руководства GNU Bash.
| Файл | Описание | Оболочки входа (см. примечание) | Интерактивные оболочки (не входа) |
|---|---|---|---|
| /etc/profile | Системный, считывает и исполняет файлы /etc/profile.d/*.sh и /etc/bash.bashrc с настройками приложений. | Да | Нет |
| ~/.bash_profile | Пользовательский, исполняется после /etc/profile . Если не существует, проверяются ~/.bash_login и ~/.profile (в указанном порядке). Файл-образец /etc/skel/.bash_profile содержит также указание на исполнение файла ~/.bashrc . | Да | Нет |
| ~/.bash_logout | Пользовательский, исполняется после выхода из оболочки входа. | Да | Нет |
| /etc/bash.bash_logout | Системный, исполняется после выхода из оболочки входа. Зависит от флага компиляции -DSYS_BASH_LOGOUT=»/etc/bash.bash_logout» . | Да | Нет |
| /etc/bash.bashrc | Системный, исполняет файл /usr/share/bash-completion/bash_completion . Зависит от флага компиляции -DSYS_BASHRC=»/etc/bash.bashrc» . | Нет | Да |
| ~/.bashrc | Пользовательский, исполняется после /etc/bash.bashrc . | Нет | Да |
- Оболочка входа будет неинтерактивной, если вызывается с флагом —login .
- Интерактивные оболочки (не входа) не исполняют файл ~/.bash_profile , они наследуют окружение от родительского процесса (которым может быть в том числе и оболочка входа). Подробнее см. GregsWiki:ProcessManagement#On processes, environments and inheritance.
Оболочка и переменные окружения
Поведение оболочки Bash и запущенных в ней программ зависит от переменных окружения. Переменные окружения хранят значения различных параметров оболочки, например, расположение каталогов с исполняемыми файлами или название используемого по умолчанию браузера. При запуске новой оболочки или сценария они наследуют переменные окружения родительского процесса, то есть начинают работу с набором переменных исходной оболочки [1].
Для создания переменной окружения необходимо экспортировать переменную оболочки:
VARIABLE=content export VARIABLE
или более кратко:
export VARIABLE=content
Переменные окружения принято перечислять в файлах ~/.profile или /etc/profile , чтобы другие Bourne-совместимые оболочки могли их использовать.
Командная строка
Командная строка Bash работает под управлением библиотеки Readline. Readline позволяет использовать комбинации клавиш в стиле emacs и vi для взаимодействия с командной строкой, например, для перемещения назад и вперёд целыми словами, удаления слов и т.д. Кроме того, Readline отвечает за хранение истории выполненных команд, а также позволяет создавать макросы.
Автодополнение
Автодополнение (tab completion) — завершение вводимых команд по нажатию клавиши Tab (работает по умолчанию).
Одиночное нажатие
Вывести список возможных завершений для частично введённой команды можно несколькими повторными нажатиями клавиши Tab — иногда двумя или тремя. В статье Readline#Быстрое завершение описано, как уменьшить количество нажатий до одного.
Дополнительные программы и опции
По умолчанию Bash позволяет дополнять команды, имена файлов и переменные. Пакет bash-completion добавляет автодополнение для наиболее распространённых команд и их опций, которые можно включить, считав и исполнив файл /usr/share/bash-completion/bash_completion (обычно считывается автоматически в /etc/bash.bashrc ). С пакетом bash-completion обычные завершения (вроде $ ls file.* ) будут вести себя немного по-другому, вернуть старое поведение можно командой $ compopt -o bashdefault программа (подробнее см. [2] и [3]).
Настройки для команд
Примечание: Встроенная команда Bash complete может конфликтовать с bash-completion .
По умолчанию Bash помогает завершать только имена файлов, которые следуют за командой. Это можно перенастроить командой complete -c , чтобы дополнялись и определённые команды:
~/.bashrc
complete -c man which
С флагами -cf завершаться будут и команды, и имена файлов после них:
complete -cf sudo
Другие опции автодополнения можно найти в руководстве Bash.
История команд
Автодополнение истории
Клавиши стрелок «вверх» и «вниз» можно назначить для поиска команд в истории (см. Readline#История команд и Синтаксис init-файлов Readline):
~/.bashrc
bind '"\e[A": history-search-backward' bind '"\e[B": history-search-forward'
Или же, чтобы это работало во всех программах Readline:
~/.inputrc
"\e[A": history-search-backward "\e[B": history-search-forward
Сокращение истории
Переменная HISTCONTROL позволяет предотвратить логирование некоторых команд. Например, чтобы одинаковые команды не попадали в историю, присвойте переменной следующее значение:
~/.bashrc
export HISTCONTROL=ignoredups
Если же задать значение erasedups , то дополнительно из истории будут удалены уже существующие дубликаты команд. Подробнее см. руководство Bash.
Отключение истории
Чтобы временно отключить историю, выполните:
$ set +o history
После этого вводимые команды не будут сохраняться в $HISTFILE .
Теперь можно выполнять «чувствительные» в плане безопасности действия, вроде вычисления хэш-суммы пароля ( printf secret | sha256sum ) или работы с GPG ( gpg -eaF secret-pubkey.asc ), не опасаясь, что секретный ключ будет сохранён на диск.
Включить историю обратно можно командой
$ set -o history
Совет: Если переменная HISTCONTROL имеет значение ignorespace , команды, начинающиеся с пробела, не будут сохраняться в файл истории. Подробнее см. bash(1) § Shell Variables .
Чтобы отключить всю историю Bash:
~/.bashrc или /etc/profile
export HISTSIZE=0
После необходимо удалить старый файл истории (имейте в виду — команды ниже удалят его безвозвратно):
$ wipe -i -l2 -x4 -p4 "$HISTFILE" $ ln -sv /dev/null "$HISTFILE"
run-help из Zsh
В Zsh есть возможность вызывать справочное руководство для команды перед курсором по комбинации клавиш Alt+h . В Bash то же самое можно сделать с помощью привязки комбинации клавиш в Readline:
~/.bashrc
run-help() < help "$READLINE_LINE" 2>/dev/null || man "$READLINE_LINE"; > bind -m vi-insert -x '"\eh": run-help' bind -m emacs -x '"\eh": run-help'
Предполагается, что вы используете (стандартный) режим редактирования Emacs.
Псевдонимы
alias (англ. псевдоним) — команда для замены одной строки на другую. Часто используется для сокращения системных команд до аббревиатур или для добавления стандартных аргументов к часто используемым командам.
Пользовательские псевдонимы хранятся в файле ~/.bashrc , а системные (для всех пользователей) — в /etc/bash.bashrc . Примеры можно посмотреть в [4].
Функции Bash подробно описаны в Bash/Функции.
Советы и рекомендации
Настройка приглашения
Подстветка синтаксиса и подсказки
blesh-git AUR — редактор командной строки, который написан на чистом Bash и предназначен заменить Readline. Предлагает множество дополнительных возможностей вроде подстветки синтаксиса, подсказок, завершения команд с выпадающим меню, аббревиатур, режима редактирования Vim, хук-функций и т.д.
После установки необходимо считать и выполнить его в интерактивном сеансе. Настройки подробно объясняются в файле ~/.blerc и wiki. Доступна также стабильная сборка blesh AUR .
Command not found
В pkgfile есть хук «command not found», который при вводе неизвестной команды автоматически ищет подходящий исполняемый файл в пакетах в официальных репозиториях.
Чтобы хук заработал, его необходимо считать и исполнить:
~/.bashrc
source /usr/share/doc/pkgfile/command-not-found.bash
После этого при попытке запустить недоступную команду будет выведена следующая информация:
$ abiword
abiword may be found in the following packages: extra/abiword 3.0.1-2 /usr/bin/abiword
Примечание: Предварительно необходимо обновить базу данных pkgfile. Подробнее см. pkgfile#Установка.
Отключение комбинации Ctrl+z
Нажатие Ctrl+z в терминале ставит приложение на паузу или закрывает его. Отключить эту комбинацию клавиш можно следующим образом:
#!/bin/bash trap "" 20 adom
Если после этого во время работы adom AUR вы по ошибке вместо Shift+z нажмёте комбинацию Ctrl+z , то она будет проигнорирована и ничего не произойдёт.
Очистка экрана после выхода
Очистка экрана виртуального терминала после выхода:
~/.bash_logout
clear reset
Смена каталога при вводе пути
Bash может автоматически добавлять команду cd , если введён только путь к каталогу. Стандартное поведение:
bash: /etc: Is a directory
Если же добавить в .bashrc строку
~/.bashrc
. shopt -s autocd .
то произойдёт следующее:
[user@host ~]$ /etc cd /etc [user@host etc]$
Autojump
autojump-git AUR позволяет перемещаться по файловой системе с помощью поиска строк в базе данных с часто посещаемыми путями. Чтобы приложение заработало, после установки необходимо считать и выполнить файл /etc/profile.d/autojump.bash .
Запрет на перезапись файлов
Отключение перезаписи файлов с помощью перенаправления вывода на время текущего сеанса:
$ set -o noclobber
Команда set -C делает то же самое.
Сделать изменения постоянными:
~/.bashrc
set -o noclobber
Принудительно перезаписать файл при установленном noclobber :
$ echo "output" >| file.txt
Решение проблем
Перенос строк при изменении размера окна
При изменении размера окна эмулятора терминала Bash может не получить соответствующий сигнал. В результате выведенный текст будет переноситься некорректно и перекроет приглашение командной строки. Опция оболочки checkwinsize проверяет размер окна после каждой команды и при необходимости обновляет значения переменных LINES и COLUMNS .
~/.bashrc
shopt -s checkwinsize
Оболочка завершается даже с опцией ignoreeof
После задания опции ignoreeof вы можете обнаружить, что многократное нажатие Ctrl-d всё равно приводит к завершению процесса оболочки. Дело в том, что по умолчанию эта опция позволяет игнорировать только 10 нажатий данной комбинации клавиш (если быть точным — 10 ситуаций EOF) перед выходом из оболочки.
Задать большее значение можно переменной IGNOREEOF. Например:
export IGNOREEOF=100
Анализ сценария и поиск ошибок
Программа shellcheck проверяет сценарии Bash (и других командных оболочек) на предмет ошибок и предлагает возможные улучшения кода.
Существует также веб-сайт shellcheck.net, разработанный на основе одноименной программы и предназначенный для той же цели.
Смотрите также
- Wikipedia:ru:Bash
- Справочное руководство Bash, также локально в файле /usr/share/doc/bash/bashref.html
- Синтаксис init-файлов Readline
- The Bourne-Again Shell — Третья глава книги The Architecture of Open Source Applications
- PS1 generator — Наглядное создание приглашения Bash с помощью мыши
- Полезные команды для .bashrc
Обучение
- Greg’s Wiki
- GregsWiki:BashGuide
- GregsWiki:BashFAQ
- Quote Tutorial
Сообщество
Примеры
Bash — что это такое и как пользоваться
Bash — это одна из самых известных командных оболочек Linux. Она позволяет выполнять различные команды ОС, а также наборы команд, оформленные в виде файлов, так называемые скрипты или сценарии. С помощью bash можно реализовывать конструкции циклов и ветвлений (for и if), перенаправлять ввод-вывод в файлы, считывать параметры из файлов, с клавиатуры, использовать переменные и т.д.
Для того чтобы выполнить команду ОС достаточно просто ввести ее в окне bash. Например:
- pwd — вывод текущего каталога
- ls — вывод списка файлов в текущем каталоге.
У большинства команд есть аргументы, например:
- cd \etc\sysconfig — перейти в каталог \etc\sysconfig,
- ls \home — вывести список файлов в каталоге \home.
Также у команд есть ключи, меняющие поведение или отображение результатов команд:
- ls -1 \home — выводит имена файлов и папок в каталоге \home списком
- ls -l \home — выводит подробную информацию от каждом файле и папке в каталоге \home
Параметры и ключи каждой команды можно посмотреть используя справочную систему man, то есть чтобы посмотреть аргументы и ключи команды cp достаточно набрать man cp и т.д.
Также можно объединять команды в последовательность действий, так называемые скрипты или сценарии.
Рассмотрим, например, скрипт проверяющий строку на совпадение с ранее заданной строкой и количество символов в ней. Для создания скрипта создайте пустой файл. Для создания файла можно использовать команду touch , например так:
Расширение у скрипта может быть любое, но рекомендуемый стандарт *.sh (SHell script).
Поместите в него нижеприведенные строки. Построчно поясню что означают те или иные строки. Комментарии и директивы процессора начинаются с символа # и идут до конца строки.
Любой скрипт начинается со строки #!/bin/bash — это позволяет понять ОС какой командный интерпретатор использовать. В нашем случае это bash.
#!/bin/bash #Зададим значения переменных “code” и “string”. String - пустая строка. code='4567' string=''” #Вывод фразы 'введите проверочный код: ' ключ -n запрещает переход на новую строку. echo -n 'введите проверочный код: ' #Ожидание ввода значения с клавиатуры и помещение результата в переменную “string” read string #Проверка условия на количество введенных букв в строке. if [[ -n $string ]]; then #вложенная проверка условия на совпадение введенной строки со значением #в переменной code if [[ $code = $string ]]; then echo 'проверочный код совпал' else echo 'код не прошел проверку' fi else echo 'слишком короткий код' fi
Теперь дадим этому скрипту права на исполнение используя команду chmod
chmod +x /home/user/script1.sh
Теперь этот скрипт можно запускать, вставлять в планировщик cron, в другие скрипты и т.д. Например нижеприведенная команда выполнит данный скрипт.
Оболочка Bash — шпаргалка для начинающих
В данной шпаргалке затрагиваются следующие темы: введение в оболочку, навигация, основные команды, переменные окружения, коннекторы, конвейеры, перенаправление ввода/вывода, права доступа и комбинации клавиш.
Оболочка Bash: введение
Оболочка, или шелл (shell) — это программа, в нашем случае названная «bash», что является сокращением от Bourne Again Shell. Оболочка принимает ваши команды и передаёт их операционной системе. Для взаимодействия с системой используются терминалы, такие как gnome-terminal, eterm, nxterm и т. п.
Навигация
В Linux файлы и каталоги имеют иерархическую организацию, то есть существует некий начальный каталог, называемый корневым. В нём содержатся файлы и подкаталоги, которые в свою очереди содержат файлы и свои подкаталоги.
pwd
Команда pwd , сокращение от print working directory, отображает текущее местоположение в структуре каталогов.
cd
Команда cd позволяет перейти в новый каталог.
mkdir
Команда mkdir создаёт новый каталог в текущем каталоге.
Основные команды
man
Команда man отображает руководства по командам. Например, следующая команда выдаст всю информацию о команде cat :
$ man cat
cat
Команда cat считывает файл, переданный как аргумент, и выводит его содержимое по стандартному каналу вывода. Передача нескольких файлов в виде аргумента приведёт к выводу конкатенированного содержимого всех файлов.
echo
Команда echo выводит свои аргументы по стандартному каналу вывода.
$ echo Hello World Hello World
Если вызвать echo без аргументов, будет выведена пустая строка.
head
Команда head читает первые 10 строк любого переданного текста и выводит их по стандартному каналу. Число выводимых строк можно изменить:
$ head -50 test.txt
tail
Команда tail работает аналогично команде head , но читает строки с конца:
$ tail -50 test.txt
Также можно просматривать добавляемые к файлу строки в режиме реального времени при помощи флага -f :
$ tail -f test.txt
less
Команда less позволяет перемещаться по переданному файлу или куску текста, причём в обоих направлениях.
$ less test.txt $ ps aux | less
Подробнее о назначении символа | будет рассказано ниже в разделе команды history .
true
Команда true всегда возвращает ноль в качестве выходного статуса для индикации успеха.
false
Команда false всегда возвращает не-ноль в качестве выходного статуса для индикации неудачи.
$? — это переменная, которая содержит выходной статус последней запущенной команды. Под статусом обычно понимается код возврата программы. 0 означает успешное выполнение программы, любое значение большее 0 отражает тот факт, что в процессе выполнения возникли некоторые ошибки. Кстати, именно поэтому в bash истинной (true) считается 0, а все, что не 0 — ложью (false):
$ true $ echo $? 0 $ false $ echo $? 1
grep
Команда grep занимается поиском переданной строки в указанном файле:
$ cat users.txt user:student password:123 user:teacher password:321 $ grep 'student` file1.txt user:student password:123
grep также может принимать несколько файлов и регулярных выражений для уточнения формата текста.
Также можно ознакомиться с руководством по regex. У нас на сайте тоже есть руководство по «регуляркам» в Python для новичков.
sed
Команда sed — это потоковый редактор, преобразующий входные текстовые данные. Обычно её используют для замены выражений так: s/regexp/replacement/g . Например, следующий код заменит все слова «Hello» на «Hi»:
$ cat test.txt Hello World $ sed 's/Hello/Hi/g' test.txt Hi World
Также вы можете ознакомиться с руководством по sed.
history
Команда history выводит историю командной строки. Обычно её используют вместе с командой grep для поиска конкретной команды. Например, следующий код найдёт все команды, содержащие строку g++ :
$ history | grep g++ 155 g++ file1.txt 159 g++ file2.txt
Здесь также используется символ | — это так называемый конвейер (pipe). Благодаря ему можно перенаправлять вывод одной команды на вход другой — таким образом в примере выше вся история, которая в обычном режиме выводится командой history прямо в вывод терминала, будет перенаправлена в grep в качестве входных данных. Мы не увидим вывода команды history , но увидим вывод команды grep .
Это может быть довольно сложно для понимания без практики, поэтому поэкспериментируйте самостоятельно, например с командами ls , history , ps (описана ниже), перенаправляя их вывод в grep , sed или less , например.
export
Команда export устанавливает переменные окружения для передачи дочерним процессам. Например, так можно передать переменную name со значением student :
$ export name=student
ps
Команда ps выводит информацию о запущенных процессах.
$ ps PID TTY TIME CMD 35346 pts/2 00:00:00 bash
Выводится четыре элемента:
- ID процесса (PID),
- тип терминала (TTY),
- время работы процесса (TIME),
- имя команды, запустившей процесс (CMD).
awk
Команда awk находит и заменяет текст в файлах по заданному шаблону: awk ‘pattern ‘ test.txt
wget
Команда wget скачивает файлы из Сети и помещает их в текущий каталог.
$ wget https://github.com/mikeizbicki/ucr-cs100
nc
Команда nc — это утилита для отладки сети. Также можно ознакомиться с руководством по nc.
ping
Команда ping тестирует сетевое подключение.
$ ping google.com PING google.com (74.125.224.34) 56(84) bytes of data. 64 bytes from lax17s01-in-f2.1e100.net (74.125.224.34): icmp_req=1 ttl=57 time=7.82 ms --- google.com ping statistics --- 1 packets transmitted, 1 received, 0% packet loss, time 8ms rtt min/avg/max/mdev = 7.794/8.422/10.792/0.699 ms
Статистика в конце показывает количество подключений, совершённых до завершения команды, и время их выполнения.
git
Git — это популярная система контроля версий. Также можно ознакомиться с руководством по git и нашими материалами.
Переменные окружения
Переменные окружения — это именованные переменные, содержащие значения, используемые одним или несколькими приложениями.
Переменная PATH содержит список каталогов, в которых система ищет исполняемые файлы.
Переменная HOME содержит путь к домашнему каталогу текущего пользователя.
Коннекторы
Коннекторы позволяют запускать несколько команд одновременно.
$ true && echo Hello Hello $ false || echo Hello Hello $ echo Hello ; ls Hello test.txt file1.txt file2.txt
Конвейеры
Конвейеры, или пайпы, позволяют соединять входные и выходные каналы различных команд. В следующем примере вывод команды ls будет передан в head , и в результате будет напечатано лишь 10 первых элементов.
$ ls -l | head
Перенаправление ввода/вывода
Перенаправление вывода
Для стандартного перенаправления вывода используются символы > и >> .
Например, этот код передаст вывод ls в файл, а не на экран:
$ ls > files.txt $ cat files.txt file1.cpp sample.txt
Если файл не существует, он создаётся, а если существует, то перезаписывается. Во избежание перезаписи стоит использовать команду >> — она дописывает данные в конец файла.
Перенаправление ввода
$ cat files.txt c b $ sort < files.txt b c
Команда sort выводит содержимое файла на экран, поскольку мы не перенаправили выход. Это можно сделать так:
$ sort < files.txt >files_sorted.txt
Продвинутое перенаправление
Добавление & к > приводит к перенаправлению как стандартного потока выхода, так и потока ошибок. Например, файл test.cpp выведет строку stdout в cout и строку stderr в cerr .
$ g++ test.cpp $ ./a.out >& test.txt $ cat test.txt stdout stderr
Если вы хотите вывести конкретный файловый дескриптор, вы можете приписать его номер к > .
Например, для перенаправления stderr в test.txt нужно сделать следующее:
$ g++ test.cpp $ ./a.out 2> test.txt stdout $ cat test.txt stderr
Права доступа
Команда ls -l выводит много информации о правах доступа к каждому файлу:
$ ls -l test.txt -rw-rw-r-- 1 user group 1097374 January 26 2:48 test.txt
chmod
Команда chmod изменяет права доступа файла. Вот типичные сочетания флагов для изменения прав конкретных пользователей:
Вы можете вызвать chmod с описанием действий над конкретным файлом. Символ - обозначает удаление прав, символ + — добавление. Следующий пример сделает файл доступным для чтения и записи владельцу и группе:
$ chmod ug+rw test.txt $ ls -l test.txt -rw-rw---- 1 user group 1097374 January 26 2:48 test.txt
Кроме того, chmod можно использовать с восьмеричными числами, где 1 — это наличие прав, а 0 — отсутствие:
rwx = 111 = 7 rw- = 110 = 6 r-x = 101 = 5 r-- = 100 = 4
Следующая команда сработает так же, как и предыдущая:
$ chmod 660 test.txt
No such file or directory
Тупо символ в другой раскладке в имени может быть. Файловые менеджеры его видят? Если перетащить с ФМ в терминал файл и потом интер?
anonymous
( 08.10.21 17:38:59 MSK )
Ответ на: комментарий от anonymous 08.10.21 17:38:59 MSK
Потом интер? У меня нет утилиты file, поэтому не могу показатьчто это бинарник. Как видите, ls его видит. Перетаскивать на другие разделы пробовал — не помогло.
jhonathan
( 08.10.21 17:44:11 MSK ) автор топика
Ответ на: комментарий от jhonathan 08.10.21 17:44:11 MSK
Файловый менеджер есть какой нибудь? mc например видит он его?
anonymous
( 08.10.21 17:47:25 MSK )
Ответ на: комментарий от jhonathan 08.10.21 17:44:11 MSK
перетащить имел ввиду с окна фм в окно эмулятора терминала а потом нажать интер в терминале
anonymous
( 08.10.21 17:49:01 MSK )
Что это за файл? Что пишет:
file ./icecat
Или это был вопрос на смекалку? Типа:
#!/usr/bin/sh echo "bash: ./icecat: No such file or directory" # а теперь угадайте как это у меня так получилось!
anonymous
( 08.10.21 18:04:44 MSK )

Ты тему отметил решенной. Каким было решение?
x86- ★
( 08.10.21 18:13:20 MSK )
Ответ на: комментарий от x86- 08.10.21 18:13:20 MSK
jhonathan
( 08.10.21 18:29:12 MSK ) автор топика
Ответ на: комментарий от anonymous 08.10.21 18:04:44 MSK
Не знаю в каком пакете утилита file в nixos. Бинарник gnu icecat.
jhonathan
( 08.10.21 18:30:50 MSK ) автор топика
Ответ на: комментарий от jhonathan 08.10.21 18:30:50 MSK
Еще раз файловый менеджер видит этот файл?
anonymous
( 08.10.21 18:39:39 MSK )
Ответ на: комментарий от anonymous 08.10.21 18:39:39 MSK
mc видит, нажимаю ентер и пишет что нет такого файла или директории.
jhonathan
( 08.10.21 19:04:30 MSK ) автор топика

Раздел, на котором лежит этот файл, точно смонтирован без noexec ?
mord0d ★★★★★
( 08.10.21 19:11:06 MSK )
Какой-то библиотеки не хватает, с которой этот icecat слинкован. Посмотри, что покажет ldd icecat.
TeopeTuK ★★★★
( 08.10.21 19:11:40 MSK )
Ответ на: комментарий от TeopeTuK 08.10.21 19:11:40 MSK

Если бы библиотеки не хватало, бинарь высрал бы трейс и упал в сегфолт. Или просто упал бы в сегфолт.
mord0d ★★★★★
( 08.10.21 19:15:48 MSK )
Ответ на: комментарий от mord0d 08.10.21 19:15:48 MSK
Для этого нужно, чтобы он запустился. А без библиотеки он не может запуститься.
TeopeTuK ★★★★
( 08.10.21 19:17:01 MSK )
Ответ на: комментарий от TeopeTuK 08.10.21 19:17:01 MSK

Без библиотеки он запустится и тут же упадёт.
Не запускаться он может либо если он не является исполняемым, либо если раздел, на котором он лежит, запрещает исполнение исполняемых файлов.
mord0d ★★★★★
( 08.10.21 19:18:39 MSK )
Ответ на: комментарий от jhonathan 08.10.21 19:04:30 MSK
Попробуй переименовать например в 12 и глянь свойства файла в mc
anonymous
( 08.10.21 19:21:40 MSK )
Ну например попытка запуска 32bit файла на системе без multilib.
Ставь file и смотри.
zemidius ★
( 08.10.21 19:23:47 MSK )
Ответ на: комментарий от mord0d 08.10.21 19:15:48 MSK

Если бы библиотеки не хватало, бинарь высрал бы трейс и упал в сегфолт. Или просто упал бы в сегфолт.
Какой дичайший бред.
Даже если библиотека загружается динамически, программа упадёт в сегфолт тогда и только тогда, когда её горе-писатель не проверяет результат на NULL. Это на самом деле более редкая ситуация, чем кажется. Особенно в системных пакетах.
При статической линковке и отсутствующей библиотеке программа даже не начнёт исполняться.
Не распространяй дезинформацию.
E ★★★
( 08.10.21 19:24:19 MSK )
Ответ на: комментарий от zemidius 08.10.21 19:23:47 MSK
Все равно не будет говорить что файла нет, или побитый файл или в имени что то
anonymous
( 08.10.21 19:25:43 MSK )
Ответ на: комментарий от anonymous 08.10.21 19:25:43 MSK
Может быть кто-то может скачать и сказать что у него?
jhonathan
( 08.10.21 19:31:11 MSK ) автор топика
Ответ на: комментарий от TeopeTuK 08.10.21 19:11:40 MSK
Ага, говорит что нет libstdc++. )))
jhonathan
( 08.10.21 19:35:08 MSK ) автор топика
baobab ★
( 08.10.21 19:40:41 MSK )
Ответ на: комментарий от jhonathan 08.10.21 19:35:08 MSK
Так ставь пакеты средствами NixOS.
sudopacman ★★★★★
( 08.10.21 19:40:58 MSK )
Ответ на: комментарий от jhonathan 08.10.21 19:35:08 MSK

Либо ставь через nix, либо patchelf твой друг.
hateyoufeel ★★★★★
( 08.10.21 19:45:15 MSK )
Ответ на: комментарий от hateyoufeel 08.10.21 19:45:15 MSK
Да ну нахрен эти кривые системы. Попросил поставить libstdcxx5, а он сказал что нет какого-то nix-support/libc-ldflags-before.
Ухожу на Dragora.
jhonathan
( 08.10.21 19:58:05 MSK ) автор топика
Ответ на: комментарий от E 08.10.21 19:24:19 MSK
При статической линковке и отсутствующей библиотеке программа даже не начнёт исполняться.
Keltir ★
( 08.10.21 20:05:52 MSK )
Ответ на: комментарий от sudopacman 08.10.21 19:40:58 MSK
Icecat ставить nixos’ом? Его нет в репозитории. Waymonad тоже нет, плохой репозиторий.
jhonathan
( 08.10.21 20:06:58 MSK ) автор топика
Ответ на: комментарий от jhonathan 08.10.21 20:06:58 MSK
man nix-build. Ну либо задуматься, зачем тебе вообще NixOS. Или же задуматься, зачем тебе ставить протухший софт.
sudopacman ★★★★★
( 08.10.21 20:15:28 MSK )

Это про попытку запустить на NixOS неопакеченное под NixOS.
t184256 ★★★★★
( 08.10.21 20:22:09 MSK )

Я таки воспроизвёл
bash: ./icecat: No such file or directory
Удаляем /usr/lib64/ld-linux-x86-64.so.2 (который ссылка на ld-2.33.so) и получаем такое сообщение )
Toxo2 ★★★
( 08.10.21 20:45:13 MSK )
Ответ на: комментарий от E 08.10.21 19:24:19 MSK
Minona ★★☆
( 08.10.21 21:32:09 MSK )
Ответ на: комментарий от Keltir 08.10.21 20:05:52 MSK

А, ну да, май бэд. Я имел в виду связывание в рантайме и во время компиляции, конечно. Работать в пятницу после работы очень вредно.
E ★★★
( 08.10.21 22:05:50 MSK )

Сторонний бинарник пытаешься запустить? Так нельзя.
quantum-troll ★★★★★
( 09.10.21 06:01:00 MSK )

Такая ошибка бывает при попытке запустить 32-битный бинарник на 64-битной системе, на которой не установлен 32-битный glibc.
Kron4ek ★★★★★
( 09.10.21 16:45:19 MSK )

Вообще это позор, что в 2021 году в линуксе выводится настолько обскурное сообщение, когда не удается найти либу, с которой слинкован запускаемый бинарь.
Если он собран для FHS дистра, попробуй steam-run, авось зависимостей стима ему хватит.
shatsky ★★
( 09.10.21 18:50:29 MSK )
Последнее исправление: shatsky 09.10.21 18:53:21 MSK (всего исправлений: 2)
Ответ на: комментарий от shatsky 09.10.21 18:50:29 MSK
Я уже арч поставил. Попробовал три свободных дристра — все не захотели загружаться. Наверное у меня слишком проприетарная система.
jhonathan
( 09.10.21 19:07:06 MSK ) автор топика

В NixOS нет динамического линковщика в /usr/lib или /lib (вообще этих директорий нет), а glibc требует явно указывать местоположение ld в ELF. Есть несколько вариантов решения:
- Использовать пакет icecat-bin из nixpkgs, возможно подсунув ему твой бинарник, и тогда туда будут в patchelf -ены правильные пути до ld и библиотек (*);
- Самому руками поработать patchelf -ом и прописать нужные пути;
- Использовать обертку которая подсунет линковщик и библиотеки, например steam-run ;
- Запускать в контейнере с обычным линуксовым юзерлендом внутри, и пробрасывать X11/wayland и звук.
(*): использовать примерно так: nix-shell -p 'icecat-bin.overrideAttrs (_: < src = ./my-icecat-tarball.tar.gz; >)' , это даст тебе шелл в котором должен быть icecat в $PATH .
balsoft ★★
( 09.10.21 23:03:55 MSK )
Последнее исправление: balsoft 09.10.21 23:05:40 MSK (всего исправлений: 1)