Начиная с Lubuntu 14.04 или ранее, формат файла конфигурации и ответ теперь немного отличаются от ответа @ SWrobel. В Ubuntu 17.10 или ранее он стал другим. Следующие инструкции были обновлены до Ubuntu 17.10:
Удалите следующие строки из ~/.config/openbox/lubuntu-rc.xml, чтобы отключить переключение рабочего стола колесика прокрутки в окне, с помощью и без клавиш-модификаторов. (Тем не менее, удерживайте внешний элемент <context …> … </context>.) [F1] Также удалите следующие строки, чтобы отключить отображение рабочего стола на колесиках прокрутки на фоне рабочего стола:<context name="Desktop">
<mousebind button="A-Up" action="Click">
<action name="GoToDesktop">
<to>previous</to>
</action>
</mousebind>
<mousebind button="A-Down" action="Click">
<action name="GoToDesktop">
<to>next</to>
</action>
</mousebind>
<mousebind button="C-A-Up" action="Click">
<action name="GoToDesktop">
<to>previous</to>
</action>
</mousebind>
<mousebind button="C-A-Down" action="Click">
<action name="GoToDesktop">
<to>next</to>
</action>
</mousebind>
<mousebind button="Left" action="Press">
<action name="Focus"/>
<action name="Raise"/>
</mousebind>
<mousebind button="Right" action="Press">
<action name="Focus"/>
<action name="Raise"/>
</mousebind>
</context>
Также удалите следующие строки, чтобы отключить любое перемещение рабочего стола колесика прокрутки при перемещении окна вокруг: <context name="MoveResize">
<mousebind button="Up" action="Click">
<action name="GoToDesktop">
<to>previous</to>
</action>
</mousebind>
<mousebind button="Down" action="Click">
<action name="GoToDesktop">
<to>next</to>
</action>
</mousebind>
<mousebind button="A-Up" action="Click">
<action name="GoToDesktop">
<to>previous</to>
</action>
</mousebind>
<mousebind button="A-Down" action="Click">
<action name="GoToDesktop">
<to>next</to>
</action>
</mousebind>
</context>
Выполните это, чтобы настройки сразу же вступили в силу [источник]: openbox --reconfigure
Сначала давайте поймем, что происходит с частью read a b c. read выполнит разбиение слов на основе значения по умолчанию для переменной IFS, которая является пробелом-табу-новой линией, и поместит все на основе этого. Если есть больше входных данных, чем переменные, чтобы удерживать его, он будет разделять разделенные части на первые переменные, а то, что не может быть установлено, - уйдет в прошлое. Вот что я имею в виду:
bash-4.3$ read a b c <<< "one two three four"
bash-4.3$ echo $a
one
bash-4.3$ echo $b
two
bash-4.3$ echo $c
three four
Именно так описано в руководстве bash (см. Цитату в конце ответа).
В вашем Случай, который случается, состоит в том, что 1 и 2 вписываются в переменные a и b, а c принимает все остальное, что является 3 4 5 6.
То, что вы также увидите много раз, это то, что люди используют while IFS= read -r line; do ... ; done < input.txt для чтения текстовых файлов по строкам. Опять же, IFS= здесь по какой-то причине управляет расщеплением слов, а точнее - отключает его и считывает одну строку текста в переменную. Если его там не было, read будет пытаться подгонять каждое отдельное слово к переменной line. Но это еще одна история, которую я рекомендую вам изучить позже, поскольку while IFS= read -r variable - очень часто используемая структура.
echo делает то, что вы ожидайте здесь. Он отображает ваши переменные точно так же, как read разместил их. Это уже было продемонстрировано в предыдущем обсуждении.
printf очень особенный, потому что он будет продолжать подгонять переменные в строку формата до тех пор, пока все они не будут исчерпаны. Поэтому, когда вы делаете printf "%d, %d, %d \n" $a $b $c, printf видит строку формата с тремя десятичными знаками, но есть больше аргументов, чем 3 (потому что ваши переменные фактически расширяются до отдельных 1,2,3,4,5,6). Это может показаться запутанным, но существует по какой-то причине как улучшенное поведение от того, что делает настоящая функция printf() на языке C.
То, что вы также сделали здесь, что влияет на результат, заключается в том, что ваши переменные не цитируются, который позволяет оболочке (а не printf) разбивать переменные на 6 отдельных элементов. Сравните это с цитированием:
bash-4.3$ read a b c <<< "1 2 3 4"
bash-4.3$ printf "%d %d %d\n" "$a" "$b" "$c"
bash: printf: 3 4: invalid number
1 2 3
Точно, потому что переменная $c цитируется, теперь она распознается как целая строка, 3 4, и она не соответствует формату %d, который это только одно целое
Теперь сделайте то же самое без кавычек:
bash-4.3$ printf "%d %d %d\n" $a $b $c
1 2 3
4 0 0
printf снова говорит: «Хорошо, у вас есть 6 элементов, но формат показывает только 3, поэтому Я буду продолжать подгонять вещи и оставлять пустым все, что не могу соответствовать фактическому вводу от пользователя ».
И во всех этих случаях вам не нужно об этом говорить. Просто запустите strace -e trace=execve и убедитесь, что команда действительно «видит»:
bash-4.3$ strace -e trace=execve printf "%d %d %d\n" $a $b $c
execve("/usr/bin/printf", ["printf", "%d %d %d\\n", "1", "2", "3", "4"], [/* 80 vars */]) = 0
1 2 3
4 0 0
+++ exited with 0 +++
bash-4.3$ strace -e trace=execve printf "%d %d %d\n" "$a" "$b" "$c"
execve("/usr/bin/printf", ["printf", "%d %d %d\\n", "1", "2", "3 4"], [/* 80 vars */]) = 0
1 2 printf: ‘3 4’: value not completely converted
3
+++ exited with 1 +++
Как правильно заметил Чарльз Даффи в комментариях, bash имеет свой собственный встроенный printf, который вы используете в своей команде, strace на самом деле вызовет версию /usr/bin/printf, а не версию оболочки. Помимо незначительных различий, для нашего интереса к этому конкретному вопросу, спецификаторы стандартного формата одинаковы, а поведение одинаковое.
Что также следует иметь в виду, так это то, что синтаксис printf гораздо более переносимый ( и поэтому предпочтительнее), чем echo, не говоря уже о том, что синтаксис более знаком с C или любым C-подобным языком, который имеет функцию printf() в нем. См. Этот отличный ответ terdon по теме printf vs echo. Хотя вы можете сделать вывод, адаптированный к вашей конкретной оболочке, в вашей конкретной версии Ubuntu, если вы собираетесь переносить скрипты в разные системы, вам, скорее всего, следует предпочесть printf, а не эхо. Возможно, вы начинающий системный администратор, работающий с машинами Ubuntu и CentOS, или, может быть, даже с FreeBSD - кто знает - поэтому в таких случаях вам придется делать выбор.
Сначала давайте поймем, что происходит с частью read a b c. read выполнит разбиение слов на основе значения по умолчанию для переменной IFS, которая является пробелом-табу-новой линией, и поместит все на основе этого. Если есть больше входных данных, чем переменные, чтобы удерживать его, он будет разделять разделенные части на первые переменные, а то, что не может быть установлено, - уйдет в прошлое. Вот что я имею в виду:
bash-4.3$ read a b c <<< "one two three four"
bash-4.3$ echo $a
one
bash-4.3$ echo $b
two
bash-4.3$ echo $c
three four
Именно так описано в руководстве bash (см. Цитату в конце ответа).
В вашем Случай, который случается, состоит в том, что 1 и 2 вписываются в переменные a и b, а c принимает все остальное, что является 3 4 5 6.
То, что вы также увидите много раз, это то, что люди используют while IFS= read -r line; do ... ; done < input.txt для чтения текстовых файлов по строкам. Опять же, IFS= здесь по какой-то причине управляет расщеплением слов, а точнее - отключает его и считывает одну строку текста в переменную. Если его там не было, read будет пытаться подгонять каждое отдельное слово к переменной line. Но это еще одна история, которую я рекомендую вам изучить позже, поскольку while IFS= read -r variable - очень часто используемая структура.
echo делает то, что вы ожидайте здесь. Он отображает ваши переменные точно так же, как read разместил их. Это уже было продемонстрировано в предыдущем обсуждении.
printf очень особенный, потому что он будет продолжать подгонять переменные в строку формата до тех пор, пока все они не будут исчерпаны. Поэтому, когда вы делаете printf "%d, %d, %d \n" $a $b $c, printf видит строку формата с тремя десятичными знаками, но есть больше аргументов, чем 3 (потому что ваши переменные фактически расширяются до отдельных 1,2,3,4,5,6). Это может показаться запутанным, но существует по какой-то причине как улучшенное поведение от того, что делает настоящая функция printf() на языке C.
То, что вы также сделали здесь, что влияет на результат, заключается в том, что ваши переменные не цитируются, который позволяет оболочке (а не printf) разбивать переменные на 6 отдельных элементов. Сравните это с цитированием:
bash-4.3$ read a b c <<< "1 2 3 4"
bash-4.3$ printf "%d %d %d\n" "$a" "$b" "$c"
bash: printf: 3 4: invalid number
1 2 3
Точно, потому что переменная $c цитируется, теперь она распознается как целая строка, 3 4, и она не соответствует формату %d, который это только одно целое
Теперь сделайте то же самое без кавычек:
bash-4.3$ printf "%d %d %d\n" $a $b $c
1 2 3
4 0 0
printf снова говорит: «Хорошо, у вас есть 6 элементов, но формат показывает только 3, поэтому Я буду продолжать подгонять вещи и оставлять пустым все, что не могу соответствовать фактическому вводу от пользователя ».
И во всех этих случаях вам не нужно об этом говорить. Просто запустите strace -e trace=execve и убедитесь, что команда действительно «видит»:
bash-4.3$ strace -e trace=execve printf "%d %d %d\n" $a $b $c
execve("/usr/bin/printf", ["printf", "%d %d %d\\n", "1", "2", "3", "4"], [/* 80 vars */]) = 0
1 2 3
4 0 0
+++ exited with 0 +++
bash-4.3$ strace -e trace=execve printf "%d %d %d\n" "$a" "$b" "$c"
execve("/usr/bin/printf", ["printf", "%d %d %d\\n", "1", "2", "3 4"], [/* 80 vars */]) = 0
1 2 printf: ‘3 4’: value not completely converted
3
+++ exited with 1 +++
Как правильно заметил Чарльз Даффи в комментариях, bash имеет свой собственный встроенный printf, который вы используете в своей команде, strace на самом деле вызовет версию /usr/bin/printf, а не версию оболочки. Помимо незначительных различий, для нашего интереса к этому конкретному вопросу, спецификаторы стандартного формата одинаковы, а поведение одинаковое.
Что также следует иметь в виду, так это то, что синтаксис printf гораздо более переносимый ( и поэтому предпочтительнее), чем echo, не говоря уже о том, что синтаксис более знаком с C или любым C-подобным языком, который имеет функцию printf() в нем. См. Этот отличный ответ terdon по теме printf vs echo. Хотя вы можете сделать вывод, адаптированный к вашей конкретной оболочке, в вашей конкретной версии Ubuntu, если вы собираетесь переносить скрипты в разные системы, вам, скорее всего, следует предпочесть printf, а не эхо. Возможно, вы начинающий системный администратор, работающий с машинами Ubuntu и CentOS, или, может быть, даже с FreeBSD - кто знает - поэтому в таких случаях вам придется делать выбор.
Сначала давайте поймем, что происходит с частью read a b c. read выполнит разбиение слов на основе значения по умолчанию для переменной IFS, которая является пробелом-табу-новой линией, и поместит все на основе этого. Если есть больше входных данных, чем переменные, чтобы удерживать его, он будет разделять разделенные части на первые переменные, а то, что не может быть установлено, - уйдет в прошлое. Вот что я имею в виду:
bash-4.3$ read a b c <<< "one two three four"
bash-4.3$ echo $a
one
bash-4.3$ echo $b
two
bash-4.3$ echo $c
three four
Именно так описано в руководстве bash (см. Цитату в конце ответа).
В вашем Случай, который случается, состоит в том, что 1 и 2 вписываются в переменные a и b, а c принимает все остальное, что является 3 4 5 6.
То, что вы также увидите много раз, это то, что люди используют while IFS= read -r line; do ... ; done < input.txt для чтения текстовых файлов по строкам. Опять же, IFS= здесь по какой-то причине управляет расщеплением слов, а точнее - отключает его и считывает одну строку текста в переменную. Если его там не было, read будет пытаться подгонять каждое отдельное слово к переменной line. Но это еще одна история, которую я рекомендую вам изучить позже, поскольку while IFS= read -r variable - очень часто используемая структура.
echo делает то, что вы ожидайте здесь. Он отображает ваши переменные точно так же, как read разместил их. Это уже было продемонстрировано в предыдущем обсуждении.
printf очень особенный, потому что он будет продолжать подгонять переменные в строку формата до тех пор, пока все они не будут исчерпаны. Поэтому, когда вы делаете printf "%d, %d, %d \n" $a $b $c, printf видит строку формата с тремя десятичными знаками, но есть больше аргументов, чем 3 (потому что ваши переменные фактически расширяются до отдельных 1,2,3,4,5,6). Это может показаться запутанным, но существует по какой-то причине как улучшенное поведение от того, что делает настоящая функция printf() на языке C.
То, что вы также сделали здесь, что влияет на результат, заключается в том, что ваши переменные не цитируются, который позволяет оболочке (а не printf) разбивать переменные на 6 отдельных элементов. Сравните это с цитированием:
bash-4.3$ read a b c <<< "1 2 3 4"
bash-4.3$ printf "%d %d %d\n" "$a" "$b" "$c"
bash: printf: 3 4: invalid number
1 2 3
Точно, потому что переменная $c цитируется, теперь она распознается как целая строка, 3 4, и она не соответствует формату %d, который это только одно целое
Теперь сделайте то же самое без кавычек:
bash-4.3$ printf "%d %d %d\n" $a $b $c
1 2 3
4 0 0
printf снова говорит: «Хорошо, у вас есть 6 элементов, но формат показывает только 3, поэтому Я буду продолжать подгонять вещи и оставлять пустым все, что не могу соответствовать фактическому вводу от пользователя ».
И во всех этих случаях вам не нужно об этом говорить. Просто запустите strace -e trace=execve и убедитесь, что команда действительно «видит»:
bash-4.3$ strace -e trace=execve printf "%d %d %d\n" $a $b $c
execve("/usr/bin/printf", ["printf", "%d %d %d\\n", "1", "2", "3", "4"], [/* 80 vars */]) = 0
1 2 3
4 0 0
+++ exited with 0 +++
bash-4.3$ strace -e trace=execve printf "%d %d %d\n" "$a" "$b" "$c"
execve("/usr/bin/printf", ["printf", "%d %d %d\\n", "1", "2", "3 4"], [/* 80 vars */]) = 0
1 2 printf: ‘3 4’: value not completely converted
3
+++ exited with 1 +++
Как правильно заметил Чарльз Даффи в комментариях, bash имеет свой собственный встроенный printf, который вы используете в своей команде, strace на самом деле вызовет версию /usr/bin/printf, а не версию оболочки. Помимо незначительных различий, для нашего интереса к этому конкретному вопросу, спецификаторы стандартного формата одинаковы, а поведение одинаковое.
Что также следует иметь в виду, так это то, что синтаксис printf гораздо более переносимый ( и поэтому предпочтительнее), чем echo, не говоря уже о том, что синтаксис более знаком с C или любым C-подобным языком, который имеет функцию printf() в нем. См. Этот отличный ответ terdon по теме printf vs echo. Хотя вы можете сделать вывод, адаптированный к вашей конкретной оболочке, в вашей конкретной версии Ubuntu, если вы собираетесь переносить скрипты в разные системы, вам, скорее всего, следует предпочесть printf, а не эхо. Возможно, вы начинающий системный администратор, работающий с машинами Ubuntu и CentOS, или, может быть, даже с FreeBSD - кто знает - поэтому в таких случаях вам придется делать выбор.
Это всего лишь предложение и вовсе не означает, что Сергей ответит. Я думаю, что Сергей написал отличный ответ о том, почему они отличаются в печати. Как переменная в считывании назначается с остальными в переменную $c как 3 4 5 6 после 1 и 2, назначается a и b. echo не будет разделять переменную для вас, где printf будет с %d s.
Однако вы можете заставить их в основном дать вам одинаковые ответы, манипулируя эхом номера в начале команды:
В /bin/bash вы можете использовать:
echo -e "1 2 3 \n4 5 6"
В /bin/sh вы можете просто использовать:
echo "1 2 3 \n4 5 6"
Bash использует -e, чтобы включить \ escape-символы, где sh не нуждается в нем, поскольку он уже включен. \n заставляет его создать новую строку, так что теперь эхо-линия разбивается на две отдельные строки, которые теперь могут использоваться два раза для вашего оператора эхо-цикла:
:~$ echo -e "1 2 3 \n4 5 6" | while read a b c; do echo "$a, $b, $c"; done
1, 2, 3
4, 5, 6
Что, в свою очередь, создает тот же вывод с использованием команды printf:
:~$ echo -e "1 2 3 \n4 5 6" | while read a b c ;do printf "%d, %d, %d \n" $a $b $c; done
1, 2, 3
4, 5, 6
В sh
$ echo "1 2 3 \n4 5 6" | while read a b c; do echo "$a, $b, $c"; done
1, 2, 3
4, 5, 6
$ echo "1 2 3 \n4 5 6" | while read a b c ;do printf "%d, %d, %d \n" $a $b $c; done
1, 2, 3
4, 5, 6
Надеюсь, что это поможет!
Это всего лишь предложение и вовсе не означает, что Сергей ответит. Я думаю, что Сергей написал отличный ответ о том, почему они отличаются в печати. Как переменная в считывании назначается с остальными в переменную $c как 3 4 5 6 после 1 и 2, назначается a и b. echo не будет разделять переменную для вас, где printf будет с %d s.
Однако вы можете заставить их в основном дать вам одинаковые ответы, манипулируя эхом номера в начале команды:
В /bin/bash вы можете использовать:
echo -e "1 2 3 \n4 5 6"
В /bin/sh вы можете просто использовать:
echo "1 2 3 \n4 5 6"
Bash использует -e, чтобы включить \ escape-символы, где sh не нуждается в нем, поскольку он уже включен. \n заставляет его создать новую строку, так что теперь эхо-линия разбивается на две отдельные строки, которые теперь могут использоваться два раза для вашего оператора эхо-цикла:
:~$ echo -e "1 2 3 \n4 5 6" | while read a b c; do echo "$a, $b, $c"; done
1, 2, 3
4, 5, 6
Что, в свою очередь, создает тот же вывод с использованием команды printf:
:~$ echo -e "1 2 3 \n4 5 6" | while read a b c ;do printf "%d, %d, %d \n" $a $b $c; done
1, 2, 3
4, 5, 6
В sh
$ echo "1 2 3 \n4 5 6" | while read a b c; do echo "$a, $b, $c"; done
1, 2, 3
4, 5, 6
$ echo "1 2 3 \n4 5 6" | while read a b c ;do printf "%d, %d, %d \n" $a $b $c; done
1, 2, 3
4, 5, 6
Надеюсь, что это поможет!
Это всего лишь предложение и вовсе не означает, что Сергей ответит. Я думаю, что Сергей написал отличный ответ о том, почему они отличаются в печати. Как переменная в считывании назначается с остальными в переменную $c как 3 4 5 6 после 1 и 2, назначается a и b. echo не будет разделять переменную для вас, где printf будет с %d s.
Однако вы можете заставить их в основном дать вам одинаковые ответы, манипулируя эхом номера в начале команды:
В /bin/bash вы можете использовать:
echo -e "1 2 3 \n4 5 6"
В /bin/sh вы можете просто использовать:
echo "1 2 3 \n4 5 6"
Bash использует -e, чтобы включить \ escape-символы, где sh не нуждается в нем, поскольку он уже включен. \n заставляет его создать новую строку, так что теперь эхо-линия разбивается на две отдельные строки, которые теперь могут использоваться два раза для вашего оператора эхо-цикла:
:~$ echo -e "1 2 3 \n4 5 6" | while read a b c; do echo "$a, $b, $c"; done
1, 2, 3
4, 5, 6
Что, в свою очередь, создает тот же вывод с использованием команды printf:
:~$ echo -e "1 2 3 \n4 5 6" | while read a b c ;do printf "%d, %d, %d \n" $a $b $c; done
1, 2, 3
4, 5, 6
В sh
$ echo "1 2 3 \n4 5 6" | while read a b c; do echo "$a, $b, $c"; done
1, 2, 3
4, 5, 6
$ echo "1 2 3 \n4 5 6" | while read a b c ;do printf "%d, %d, %d \n" $a $b $c; done
1, 2, 3
4, 5, 6
Надеюсь, что это поможет!