Когда оболочка встречает текст, заключенный в $( ), он: принимает его за команду и (как говорит 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) расширяются только тогда, когда оболочка видит их в качестве первого слова команды (и они не унаследованы подоболочки).
Это может не работать в 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
sudo /usr/lib/lightdm/lightdm-set-defaults --session gnome-shell
– wim
23 October 2011 в 18:09
Я редактировал /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 (диспетчер отображения Ubuntu 11.10 , который предоставляет графический экран входа в систему ) не помнит ваш выбор в reboots.
Вы можете вручную отредактировать соответствующий файл конфигурации, который называется .dmrc
, и находится в вашей домашней папке. В Nautilus (файловый браузер) вам нужно нажать Ctrl + H (или Просмотреть > Показать скрытые файлы ), чтобы увидеть его и другие файлы, начинающиеся с .
. Если у вас есть этот файл, который вы, вероятно, сделаете, то его содержимое будет выглядеть следующим образом:
[Desktop]
Session=ubuntu
Для GNOME Classic вы можете изменить его, чтобы сказать:
[Desktop]
Session=gnome-classic
Или для GNOME Classic (без эффектов) вы можете изменить его, чтобы сказать:
[Desktop]
Session=gnome-fallback
Если вам захотелось использовать Unity 2D (сеанс type Ubuntu 2D ), вы можете изменить его, чтобы сказать:
[Desktop]
Session=ubuntu-2d
Если у вас нет файла вообще, вы можете создать его с соответствующим содержимым.
Если вы хотите установить GNOME Classic или GNOME Classic (без эффектов) в качестве типа сеанса по умолчанию для всех пользователей - или вы предпочтете не для, но вышеупомянутый пользовательский метод не работает - тогда вы можете отредактировать /etc/lightdm/lightdm.conf
, изменив строку, которая говорит user-session=ubuntu
, вместо этого скажите user-session=gnome-classic
или user-session=gnome-fallback
(или user-session=ubuntu-2d
). Несколько соображений, которые следует учитывать при рассмотрении этого вопроса:
sudo cp /etc/lightdm/lightdm.conf /etc/lightdm/lightdm.conf.old
. gksu gedit /etc/lightdm/lightdm.conf
(либо в окне терминала, либо в графическом Run Application
текстовом поле, когда вы можете получить, нажав Alt + F2) или sudo -H gedit /etc/lightdm/lightdm.conf
в окне терминала. Кажется вероятным, что поведение, которое вы испытываете, является ошибкой, поэтому, собрав дополнительную информацию, посмотрев, работает ли вручную ~/.dmrc
, вы можете сообщить об этом как один. Сначала прочтите это внимательно , затем после поиска, чтобы узнать, была ли обнаружена аналогичная ошибка, инициируйте процесс отчетности, вызвав ubuntu-bug
с помощью PID работающего процесса lightdm
или, почти так же хорошо , запустите ubuntu-bug lightdm
... что должно иметь смысл после того, как вы прочитали , что руководство .
Кстати, помимо Unity (тип сеанса Ubuntu ), Unity 2D (тип сеанса Ubuntu 2D ) и GNOME 3 Fallback ( GNOME Classic и GNOME Classic (без эффектов) ), вы можете также рассмотреть как еще более легкие варианты Xfce4 (установить пакет xubuntu-desktop
и выбрать тип сеанса Xubuntu ) и LXDE (установить пакет lubuntu-desktop
и выбрать тип сеанса Lubuntu ).
ubuntu-mate-desktop
(см. Ubuntu MATE ). Также есть GNOME 3 с оболочкой GNOME вместо Unity (установите пакет gnome-shell
и выберите GNOME
) и KDE 4 Плазма (установите пакет kubuntu-desktop
и выберите Kubuntu
), но вряд ли они будут менее ресурсоемкими, чем перечисленные выше опции.