Когда оболочка встречает текст, заключенный в $( ), он: принимает его за команду и (как говорит bodhi.zazen) запускает команду в подоболочке. Заменяет вывод команды вместо всего выражения (включая открытие $( и закрытие )).
Как объясняет ответ, это один из двух доступных синтаксисов для подстановки команд.
На самом деле несколько необычно, что выход ls будет точно таким же, как и выход echo $(ls):
ek@Io:~/tmp$ ls
bar foo
ek@Io:~/tmp$ echo $(ls)
bar foo
ответ heartsmagic обычно отделяет имена файлов на два или более пробела или новую строку. Это помогает нам легче рассказать об этом, особенно потому, что пространства в именах файлов несколько обычны (но несколько последовательных пробелов, менее распространены).
Когда я побежал echo $(ls) произошло следующее:
Заставляет его быть командой и (как говорит bodhi.zazen) запускает команду в подоболочке. Затем оболочка выполнила разбиение слов, рассматривая bar и foo в качестве отдельных аргументов команды echo вместо одного аргумента, содержащего пробелы.Когда echo получает несколько аргументов (кроме таких параметров, как -n, которые обрабатываются специально и вообще не печатаются), он распечатывает их все, с одним пробелом между последующими аргументами. echo затем печатает новую строку (если не была выбрана опция -n).
Таким образом, echo $(ls) показывает вывод, например bar foo вместо bar foo.
Если вы запустите ls, и в нем нет файлов или только одного файла, вывод ls будет точно таким же, как вывод echo $(ls). Даже тогда, это не всегда будет одинаково, например, когда имя файла содержит пробелы, отличные от изолированных (одиночных) пространств:
ek@Io:~/tmp2$ touch 'my file'
ek@Io:~/tmp2$ ls
my file
ek@Io:~/tmp2$ echo $(ls)
my file
Когда ls печатает несколько файлов, его вывод вряд ли будет точно так же, как вывод $(ls). Аналогично:
echo a b и echo $(echo a b) выдают один и тот же вывод, но echo 'a b' и echo $(echo 'a b') этого не делают.Это важная вещь, которую нужно знать о подстановке команд - некотируемые подстановки команд подлежат разбиению слов.
Если вы хотите предотвратить слово расщепление, вы можете заключить выражение для подстановки команды в двойные кавычки ("). Обычно это достаточно и, в частности, будет работать с приведенными выше примерами echo, а также с примером ls в каталоге с одной записью, содержащей пробелы:
ek@Io:~/tmp2$ echo "$(ls)"
my file
Однако, как было отмечено выше, вы можете быть удивлены, обнаружив, что то, что вы видите при запуске ls, часто не является тем, что передается на echo вместо "$(ls)":
ek@Io:~/tmp$ ls
bar foo
ek@Io:~/tmp$ echo "$(ls)"
bar
foo
Это потому, что ls проверяет, является ли echo терминалом один из двух доступных синтаксисов , когда форматирование вывода явно не указано.
[ f36] и echo $(echo a b) выдают одинаковый вывод, но Когда stdout не является терминалом, ls перечисляет каждую запись в своей строке, например ls -1.В подстановке команд стандартный вывод не является терминалом, потому что вывод команды не отправляется непосредственно на терминал, чтобы вы могли видеть - вместо этого он захватывается оболочкой и используется как часть другая команда.
Чтобы получить форматирование нескольких столбцов при запуске ls с помощью подстановки команды, передайте ему флаг -C: иногда предлагается
ek@Io:~/tmp$ echo "$(ls -C)"
bar foo
(dir в качестве альтернативы ls -C, а также будет работать для этого, хотя dir ведет себя как ls -C -b, а не просто ls -C.)
Другая причина [ f58] может иногда отличаться от echo "$(ls)", так это то, что ls может быть dir ведет себя как ls -C -b, а не просто ls -C . Запустите alias ls, чтобы проверить; на Ubuntu вы обычно получаете alias ls='ls --color=auto', а это означает, что когда ls появляется как первое слово команды, которую вы запускаете в интерактивном режиме (и в некоторых, но не во всех других случаях), она заменяется на ls --color=auto.
Например, когда я запускаю ls, он отображает каталоги, окрашенные в синий цвет, и исполняемые файлы окрашены в зеленый цвет (а также реализуют многие другие правила раскраски). --color=auto заставляет ls печатать цветной выход, если стандартный вывод является терминалом, а не иначе.
Чтобы получить цветной выход при запуске ls с помощью подстановки команды, передайте ему --color или [ f70]. Если вы хотите, вы можете комбинировать это с -C:
echo $(ls -C --color)
Обратите внимание, что, хотя вы можете сделать ls псевдоним ls --color или ls --color=always вместо ls --color=auto и [ f76] не волнует, является ли стандартный вывод терминалом ... этот псевдоним все равно не приведет к тому, что ls будет выдавать цветной вывод при вызове путем подстановки команды. Это связано с тем, что псевдонимы оболочки (в передают ему параметр --color или --color=always , подобный bash) расширяются только тогда, когда оболочка видит их в качестве первого слова команды (и они не унаследованы подоболочки).
Список сеансов описан в каталоге /usr/share/xsessions
.
Некоторые из наиболее распространенных имен сеансов следующие:
Таким образом, если вы измените конфигурационный файл light-dm на «ubuntu-2d», это будет по умолчанию сеансом для Unity-2D
, то есть
sudo nano /etc/lightdm/lightdm.conf
измените строку
user-session=ubuntu
на
user-session=ubuntu-2d
Примечание - если у вас нет файла lightdm.conf, то для использования автолога следующие значения для этого файла:
[SeatDefaults]
greeter-session=unity-greeter
user-session=ubuntu-2d
autologin-user=myusername
autologin-user-timeout=0
Другая возможность:
[f 5]Например:
sudo /usr/lib/lightdm/lightdm-set-defaults -s ubuntu-2d
Это также создаст файл lightdm.conf
, если он еще не присутствовал.
Список сеансов описан в каталоге /usr/share/xsessions
.
Некоторые из наиболее распространенных имен сеансов следующие:
Таким образом, если вы измените конфигурационный файл light-dm на «ubuntu-2d», это будет по умолчанию сеансом для Unity-2D
, то есть
sudo nano /etc/lightdm/lightdm.conf
измените строку
user-session=ubuntu
на
user-session=ubuntu-2d
Примечание - если у вас нет файла lightdm.conf, то для использования автолога следующие значения для этого файла:
[SeatDefaults]
greeter-session=unity-greeter
user-session=ubuntu-2d
autologin-user=myusername
autologin-user-timeout=0
Другая возможность:
[f 5]Например:
sudo /usr/lib/lightdm/lightdm-set-defaults -s ubuntu-2d
Это также создаст файл lightdm.conf
, если он еще не присутствовал.
Список сеансов описан в каталоге /usr/share/xsessions
.
Некоторые из наиболее распространенных имен сеансов следующие:
Таким образом, если вы измените конфигурационный файл light-dm на «ubuntu-2d», это будет по умолчанию сеансом для Unity-2D
, то есть
sudo nano /etc/lightdm/lightdm.conf
измените строку
user-session=ubuntu
на
user-session=ubuntu-2d
Примечание - если у вас нет файла lightdm.conf, то для использования автолога следующие значения для этого файла:
[SeatDefaults]
greeter-session=unity-greeter
user-session=ubuntu-2d
autologin-user=myusername
autologin-user-timeout=0
Другая возможность:
[f 5]Например:
sudo /usr/lib/lightdm/lightdm-set-defaults -s ubuntu-2d
Это также создаст файл lightdm.conf
, если он еще не присутствовал.
Список сеансов описан в каталоге /usr/share/xsessions
.
Некоторые из наиболее распространенных имен сеансов следующие:
Таким образом, если вы измените конфигурационный файл light-dm на «ubuntu-2d», это будет по умолчанию сеансом для Unity-2D
, то есть
sudo nano /etc/lightdm/lightdm.conf
измените строку
user-session=ubuntu
на
user-session=ubuntu-2d
Примечание - если у вас нет файла lightdm.conf, то для использования автолога следующие значения для этого файла:
[SeatDefaults]
greeter-session=unity-greeter
user-session=ubuntu-2d
autologin-user=myusername
autologin-user-timeout=0
Другая возможность:
[f 5]Например:
sudo /usr/lib/lightdm/lightdm-set-defaults -s ubuntu-2d
Это также создаст файл lightdm.conf
, если он еще не присутствовал.
Список сеансов описан в каталоге /usr/share/xsessions
.
Некоторые из наиболее распространенных имен сеансов следующие:
Таким образом, если вы измените конфигурационный файл light-dm на «ubuntu-2d», это будет по умолчанию сеансом для Unity-2D
, то есть
sudo nano /etc/lightdm/lightdm.conf
измените строку
user-session=ubuntu
на
user-session=ubuntu-2d
Примечание - если у вас нет файла lightdm.conf, то для использования автолога следующие значения для этого файла:
[SeatDefaults]
greeter-session=unity-greeter
user-session=ubuntu-2d
autologin-user=myusername
autologin-user-timeout=0
Другая возможность:
[f 5]Например:
sudo /usr/lib/lightdm/lightdm-set-defaults -s ubuntu-2d
Это также создаст файл lightdm.conf
, если он еще не присутствовал.
Список сеансов описан в каталоге /usr/share/xsessions
.
Некоторые из наиболее распространенных имен сеансов следующие:
Таким образом, если вы измените конфигурационный файл light-dm на «ubuntu-2d», это будет по умолчанию сеансом для Unity-2D
, то есть
sudo nano /etc/lightdm/lightdm.conf
измените строку
user-session=ubuntu
на
user-session=ubuntu-2d
Примечание - если у вас нет файла lightdm.conf, то для использования автолога следующие значения для этого файла:
[SeatDefaults]
greeter-session=unity-greeter
user-session=ubuntu-2d
autologin-user=myusername
autologin-user-timeout=0
Другая возможность:
[f 5]Например:
sudo /usr/lib/lightdm/lightdm-set-defaults -s ubuntu-2d
Это также создаст файл lightdm.conf
, если он еще не присутствовал.
Список сеансов описан в каталоге /usr/share/xsessions
.
Некоторые из наиболее распространенных имен сеансов следующие:
Таким образом, если вы измените конфигурационный файл light-dm на «ubuntu-2d», это будет по умолчанию сеансом для Unity-2D
, то есть
sudo nano /etc/lightdm/lightdm.conf
измените строку
user-session=ubuntu
на
user-session=ubuntu-2d
Примечание - если у вас нет файла lightdm.conf, то для использования автолога следующие значения для этого файла:
[SeatDefaults]
greeter-session=unity-greeter
user-session=ubuntu-2d
autologin-user=myusername
autologin-user-timeout=0
Другая возможность:
[f 5]Например:
sudo /usr/lib/lightdm/lightdm-set-defaults -s ubuntu-2d
Это также создаст файл lightdm.conf
, если он еще не присутствовал.
Список сеансов описан в каталоге /usr/share/xsessions
.
Некоторые из наиболее распространенных имен сеансов следующие:
Таким образом, если вы измените конфигурационный файл light-dm на «ubuntu-2d», это будет по умолчанию сеансом для Unity-2D
, то есть
sudo nano /etc/lightdm/lightdm.conf
измените строку
user-session=ubuntu
на
user-session=ubuntu-2d
Примечание - если у вас нет файла lightdm.conf, то для использования автолога следующие значения для этого файла:
[SeatDefaults]
greeter-session=unity-greeter
user-session=ubuntu-2d
autologin-user=myusername
autologin-user-timeout=0
Другая возможность:
[f 5]Например:
sudo /usr/lib/lightdm/lightdm-set-defaults -s ubuntu-2d
Это также создаст файл lightdm.conf
, если он еще не присутствовал.
user-session=ubuntu
не существует в файле /etc/lightdm/lightdm.conf
, тогда просто введите ее в качестве последней строки: user-session=ubuntu-2d
– Sepero
15 October 2015 в 22:10
Чтобы изменить сеанс по умолчанию в Lightdm
sudo /usr/lib/lightdm/lightdm-set-defaults --session gnome-shell
Я редактировал /etc/lightdm/lightdm.conf
с этим контентом:
[SeatDefaults]
greeter-session=unity-greeter
user-session=gnome-shell
autologin-user=paul
И он автоматически запускается в gnome-shell.
Это может не работать в Ubuntu, но это сработало для меня в Fedora. Мне потребовались дни, и я хотел бы поделиться им:
Перейдите к /usr/share/xsessions
и /usr/share/wayland-sessions
и добавьте префиксы с другим номером и тире для каждого файла, заканчивающегося на .desktop. Самое низкое число будет по умолчанию. Например, я хочу, чтобы xfce был моим по умолчанию, так что файл называется 1-xfce.desktop
Надеюсь, что это поможет.
Чтобы изменить сеанс по умолчанию в Lightdm
sudo /usr/lib/lightdm/lightdm-set-defaults --session gnome-shell
Я редактировал /etc/lightdm/lightdm.conf
с этим контентом:
[SeatDefaults]
greeter-session=unity-greeter
user-session=gnome-shell
autologin-user=paul
И он автоматически запускается в gnome-shell.
, чтобы изменить значение по умолчанию для каждого пользователя, проверьте
blockquote>
/var/lib/AccountsService/users
похоже, что этот набор
.dmrc
в домашнем доме пользователя.приветствия
Я считаю, что установка любого из вышеперечисленных значений отменяется последним сеансом пользователей, хранящимся в lightdm. Возможно, вам придется удалить или отредактировать пользовательские файлы в /var/cache/lightdm/dmrc
, чтобы включить глобальную настройку по умолчанию. Или индивидуально, отредактировав файл user.dmrc
, который имеет следующее содержимое:
[Desktop]
Session=ubuntu
Это может не работать в Ubuntu, но это сработало для меня в Fedora. Мне потребовались дни, и я хотел бы поделиться им:
Перейдите к /usr/share/xsessions
и /usr/share/wayland-sessions
и добавьте префиксы с другим номером и тире для каждого файла, заканчивающегося на .desktop. Самое низкое число будет по умолчанию. Например, я хочу, чтобы xfce был моим по умолчанию, так что файл называется 1-xfce.desktop
Надеюсь, что это поможет.
Чтобы изменить сеанс по умолчанию в Lightdm
sudo /usr/lib/lightdm/lightdm-set-defaults --session gnome-shell
Я редактировал /etc/lightdm/lightdm.conf
с этим контентом:
[SeatDefaults]
greeter-session=unity-greeter
user-session=gnome-shell
autologin-user=paul
И он автоматически запускается в gnome-shell.
, чтобы изменить значение по умолчанию для каждого пользователя, проверьте
blockquote>
/var/lib/AccountsService/users
похоже, что этот набор
.dmrc
в домашнем доме пользователя.приветствия
Это может не работать в Ubuntu, но это сработало для меня в Fedora. Мне потребовались дни, и я хотел бы поделиться им:
Перейдите к /usr/share/xsessions
и /usr/share/wayland-sessions
и добавьте префиксы с другим номером и тире для каждого файла, заканчивающегося на .desktop. Самое низкое число будет по умолчанию. Например, я хочу, чтобы xfce был моим по умолчанию, так что файл называется 1-xfce.desktop
Надеюсь, что это поможет.
Чтобы изменить сеанс по умолчанию в Lightdm
sudo /usr/lib/lightdm/lightdm-set-defaults --session gnome-shell
Я редактировал /etc/lightdm/lightdm.conf
с этим контентом:
[SeatDefaults]
greeter-session=unity-greeter
user-session=gnome-shell
autologin-user=paul
И он автоматически запускается в gnome-shell.
Это может не работать в Ubuntu, но это сработало для меня в Fedora. Мне потребовались дни, и я хотел бы поделиться им:
Перейдите к /usr/share/xsessions
и /usr/share/wayland-sessions
и добавьте префиксы с другим номером и тире для каждого файла, заканчивающегося на .desktop. Самое низкое число будет по умолчанию. Например, я хочу, чтобы xfce был моим по умолчанию, так что файл называется 1-xfce.desktop
Надеюсь, что это поможет.
Чтобы изменить сеанс по умолчанию в Lightdm
sudo /usr/lib/lightdm/lightdm-set-defaults --session gnome-shell
Я редактировал /etc/lightdm/lightdm.conf
с этим контентом:
[SeatDefaults]
greeter-session=unity-greeter
user-session=gnome-shell
autologin-user=paul
И он автоматически запускается в gnome-shell.
, чтобы изменить значение по умолчанию для каждого пользователя, проверьте
blockquote>
/var/lib/AccountsService/users
похоже, что этот набор
.dmrc
в домашнем доме пользователя.приветствия
Я считаю, что установка любого из вышеперечисленных значений отменяется последним сеансом пользователей, хранящимся в lightdm. Возможно, вам придется удалить или отредактировать пользовательские файлы в /var/cache/lightdm/dmrc
, чтобы включить глобальную настройку по умолчанию. Или индивидуально, отредактировав файл user.dmrc
, который имеет следующее содержимое:
[Desktop]
Session=ubuntu
Это может не работать в Ubuntu, но это сработало для меня в Fedora. Мне потребовались дни, и я хотел бы поделиться им:
Перейдите к /usr/share/xsessions
и /usr/share/wayland-sessions
и добавьте префиксы с другим номером и тире для каждого файла, заканчивающегося на .desktop. Самое низкое число будет по умолчанию. Например, я хочу, чтобы xfce был моим по умолчанию, так что файл называется 1-xfce.desktop
Надеюсь, что это поможет.
Чтобы изменить сеанс по умолчанию в Lightdm
sudo /usr/lib/lightdm/lightdm-set-defaults --session gnome-shell
, чтобы изменить значение по умолчанию для каждого пользователя, проверьте
blockquote>
/var/lib/AccountsService/users
похоже, что этот набор
.dmrc
в домашнем доме пользователя.приветствия