Перейти к содержимому

Bash is a directory что это

  • автор:

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 — шпаргалка для начинающих

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

Оболочка Bash: введение

Оболочка, или шелл (shell) — это программа, в нашем случае названная «bash», что является сокращением от Bourne Again Shell. Оболочка принимает ваши команды и передаёт их операционной системе. Для взаимодействия с системой используются терминалы, такие как gnome-terminal, eterm, nxterm и т. п.

Навигация

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

pwd

Команда pwd , сокращение от print working directory, отображает текущее местоположение в структуре каталогов.

cd

Команда cd позволяет перейти в новый каталог.

Оболочка Bash — шпаргалка для начинающих 1

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 .

Оболочка Bash — шпаргалка для начинающих 2

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 также может принимать несколько файлов и регулярных выражений для уточнения формата текста.

Оболочка Bash — шпаргалка для начинающих 3

Также можно ознакомиться с руководством по 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 содержит путь к домашнему каталогу текущего пользователя.

Коннекторы

Коннекторы позволяют запускать несколько команд одновременно.

Оболочка Bash — шпаргалка для начинающих 4

$ 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 

Если вы хотите вывести конкретный файловый дескриптор, вы можете приписать его номер к > .

Оболочка Bash — шпаргалка для начинающих 5

Например, для перенаправления 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 

Оболочка Bash — шпаргалка для начинающих 6

chmod

Команда chmod изменяет права доступа файла. Вот типичные сочетания флагов для изменения прав конкретных пользователей:

Оболочка Bash — шпаргалка для начинающих 7

Вы можете вызвать 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. Есть несколько вариантов решения:

  1. Использовать пакет icecat-bin из nixpkgs, возможно подсунув ему твой бинарник, и тогда туда будут в patchelf -ены правильные пути до ld и библиотек (*);
  2. Самому руками поработать patchelf -ом и прописать нужные пути;
  3. Использовать обертку которая подсунет линковщик и библиотеки, например steam-run ;
  4. Запускать в контейнере с обычным линуксовым юзерлендом внутри, и пробрасывать 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)

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *