LPIC 103.4 Использование потоков, конвейров и перенаправлений

Поделиться
HTML-код
  • Опубликовано: 12 сен 2024
  • Отвечаем на следующие вопросы:
    - что такое стандартный ввод и вывод в Linux?
    - как перенаправить вывод команды в файл в Linux?
    - как получить вводные данные для команды из файла в Linux?
    - как передать вывод одной команды на ввод другой в Linux?
    - как вывести ошибки выполнения команды в файл в Linux?

Комментарии • 43

  • @KirillSemaev
    @KirillSemaev  7 лет назад +2

    Свежий мануал: github.com/ksemaev

  • @EugeneNuke
    @EugeneNuke 8 лет назад +32

    Про xargs наврал и не привёл самые распространенные примеры. Вкратце, если find -name "*.txt" выведет 3 файла:
    1.txt
    2.txt
    3.txt
    то find -name "*.txt" | xargs rm будет прямым эквивалентом команды
    rm 1.txt 2.txt 3.txt
    т.е. rm будет выполнена 1 раз, а не "построчно" как сказано в видео. Во-вторых, если имя файла содержит пробел - этот номер не пройдёт. В-третьих, длина команды и её аргументов ограничена(MAX_ARGS) и команда xargs позволяет обойти это ограничение. Грубо говоря, если в выше приведённом примере find находит не 3 файла, а миллион(M), то он вызовет команду не миллион раз, а M/MAX_ARGS раз, т.е. значительно меньше раз будет вызвана команда.

    • @KirillSemaev
      @KirillSemaev  8 лет назад +22

      Отлично, действительно соврал, меня не так учили, а на такой важный нюанс внимания не обратил, правлю поверх видео. Спасибо!

    • @fedorovnikolay8033
      @fedorovnikolay8033 3 года назад

      Но при этом find . -name "*.txt" | xargs -I {} echo {} '---'
      ./lpic_1-101/homework/103_5_dz.txt ---
      ./lpic_1-101/homework/104_4_dz.txt ---
      ./lpic_1-101/homework/102_5_dz.txt ---
      ./lpic_1-101/homework/102_3_dz.txt ---

  • @expmodish9940
    @expmodish9940 Год назад +1

    Бесценный материал!

  • @user-ut8xi7hh7w
    @user-ut8xi7hh7w 7 месяцев назад +1

    Благодарю за урок

  • @user-rd1sk4wg7x
    @user-rd1sk4wg7x 7 лет назад +2

    Просто лучший!

  • @carloscastaneda9018
    @carloscastaneda9018 7 лет назад +5

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

    • @mithlars
      @mithlars 5 лет назад +1

      прямо не скорее, а так и есть.

    • @ainurkhairullin6723
      @ainurkhairullin6723 Год назад

      grep ищет подстроку в строке

  • @TheAgressor13
    @TheAgressor13 10 месяцев назад +1

    Балдежный видос, сапсибо

  • @sapiens_life
    @sapiens_life 2 года назад

    большое спасибо, Кирилл

  • @vesh95
    @vesh95 5 лет назад

    Ну тут не по именам лучше, а по датам так искать 10:00
    Ибо rm, на сколько я помню, сам умеет звездочки обрабатывать

  • @vokalengeers4486
    @vokalengeers4486 3 года назад

    Объясните. Есть возможность скомбинировать команды tee и grep?
    Записать отфильтрованные данные в файл через grep и с помощью tee вывести на экран?

  • @DaggerPoison
    @DaggerPoison 7 лет назад +2

    Почему нельзя просто сделать find . -name "*.txt" | rm -rf ?

    • @valeriytyutyunnik
      @valeriytyutyunnik 4 года назад

      Ключ -f глушит весь вывод. Без него в таком виде rm вернет ошибку об отсутствующем аргументе
      можно вызвать вовсе без find
      rm -rf *.txt

    • @Rogov_Oleg
      @Rogov_Oleg 3 года назад

      Это учебный пример. Он мог ещё проще rm -rf *.txt

  • @Ed-Bubble
    @Ed-Bubble 8 лет назад +1

    Еще один вопросик - понятно что значит

    • @EugeneNuke
      @EugeneNuke 8 лет назад +7

    • @KirillSemaev
      @KirillSemaev  8 лет назад

      Опять ютуб не оповестил о комменте(( Евгений ответил, ему - спасибо!

    • @KirillSemaev
      @KirillSemaev  8 лет назад

      Я кстати так и не смог найти нормальное описание всех этих символов, может вы подскажете где их искать? Например тут ru.wikipedia.org/wiki/Bash уже даже

    • @EugeneNuke
      @EugeneNuke 8 лет назад +1

      triple less,

    • @EugeneNuke
      @EugeneNuke 8 лет назад +2

  • @Ed-Bubble
    @Ed-Bubble 8 лет назад +1

    На 03:15 при записи ls>list.txt в новый файл записывается также имя нашего нового файла - list.txt. Это что же получается, > опережает время и берет список из будущего?) как этого избежать? недавно сам с этим столкнулся, когда создавал txt со списком файлов, пришлось заходить и вручную удалять эту лишнюю строчку

    • @KirillSemaev
      @KirillSemaev  8 лет назад

      +Eduard Bulatov ну это же не совсем из будущего)) На тот момент что вы смотрите в файл он уже находится в папке, поэтому его содержимое справедливо. Хотя конечно понимаю, в момент выполнения команды ls файла еще не было, я как-то на это никогда не обращал внимания)
      Можно написать скрипт простой, или функцию, которая будет выполнять тот же самый ls в файл 123213213213.txt, например, а потом находить в созданном файле эту строку "123213213213.txt" и удалять её

    • @Ed-Bubble
      @Ed-Bubble 8 лет назад

      +Kirill Semaev спасибо, Кирилл! Классные уроки, так держать

    • @EugeneNuke
      @EugeneNuke 8 лет назад +7

      Если совсем правильно, то перенаправлением потоков () занимается ваша оболочка (bash), она же вызывает набранные вами команды. Сначала происходит перенаправление (и создание файла), а потом вызов команды ls.

    • @KirillSemaev
      @KirillSemaev  8 лет назад

      А почему сначала происходит перенаправление?

    • @EugeneNuke
      @EugeneNuke 8 лет назад +13

      Оболочка (bash) обрабатывает всё что вы ему вводите с клавиатуры. Символы перенаправления - это указание для оболочки а не для команды. Команда вообще не в курсе что вы что-то изменили, она как читала со стандартного ввода, так и читает (или пишет в стандартный вывод). Вы просто изменили сам стандартный ввод/вывод на что-то другое (изменили значения "файловых" дескрипторов стандартных потоков на другие "файлы"). Соответственно, bash перед вызовом команды подготавливает её окружение - меняет значения перенаправленных дескрипторов на указанные, создаёт файлы, если их нет (чтобы получить файловый дескриптор) а затем выполняет команду.

  • @Rogov_Oleg
    @Rogov_Oleg 3 года назад

    for по моему опыту существенно практичнее, чем xargs

  • @user-gz6vj8kz9g
    @user-gz6vj8kz9g 5 лет назад

    А как сделать перемещение, найденных файлов командой find через конвейер с использованием xargs? в этом случае нужно команде mv уже 2 аргумента вместо одного для команды rm

    • @KirillSemaev
      @KirillSemaev  5 лет назад

      не понимаю, вы их хотите в разные места двигать? Дайте пример

    • @user-gz6vj8kz9g
      @user-gz6vj8kz9g 5 лет назад

      @@KirillSemaev просто вместо команды rm попробуйте применить команду mv в той же связке.

  • @lRickl
    @lRickl 8 лет назад

    Спасибо за урок!
    Вопрос по ДЗ:
    не разберусь как сделать это задание:
    5) Вывести результат команды ping it-semaev.ru в консоль, отображая только последние пять символов каждой строки..
    пните где искать ...
    Спасибо!

    • @KirillSemaev
      @KirillSemaev  8 лет назад

      Ну можно попробовать так: stackoverflow.com/questions/9219964/bash-get-the-last-4-characters-of-output-from-standard-out-inline

    • @OpusPost
      @OpusPost 8 лет назад +3

      Я сделал так ping -c 10 it-semaev.ru | rev | cut -c 1-5 | rev

    • @TyranRussian
      @TyranRussian 7 лет назад

      Вот еще так можно: ping -c 10 it-semaev.ru | awk '{ print substr( $0, length($0) - 4, length($0) ) }'

  • @sergeybarmaley125
    @sergeybarmaley125 10 месяцев назад

    Жаль что раньше Я не видел твоих видосов !!! Другие показывают просто фуфло !!!

  • @vladimirkulakov8667
    @vladimirkulakov8667 Год назад

    я думал, зачем find . -name "*.txt" | xargs rm ... Ведь можно rm *.txt , но дело именно в количестве вызовов команды rm

  • @BoffkaBoffka
    @BoffkaBoffka 3 года назад

    СПАСИБО!