Первая часть этого ответа заключается в том, что jobs
и dirs
являются встроенными -ins, поэтому обычно bash просто запускает их напрямую, а не вызывает подоболочку.
Это верно для случаев, когда есть конвейеры или подстановка команд($(jobs)
)или подстановка процессов(<(jobs)
).
Это не относится к запуску команды в фоновом режиме(jobs &
)или явному запросу подоболочки (с помощью ( jobs )
.)
Это объясняет последнюю часть вашего вопроса. Когда вы запускаете jobs
в подоболочке, он действительно показывает задания для самой подоболочки.
Вот хорошая демонстрация этой концепции:
$ sleep 1001 &
[1] 15927
$ sleep 1002 &
[2] 15940
$ jobs
[1]- Running sleep 1001 &
[2]+ Running sleep 1002 &
$ ( sleep 1003 & jobs )
[1]+ Running sleep 1003 &
$ jobs
[1]- Running sleep 1001 &
[2]+ Running sleep 1002 &
Вы увидите, что в случае, когда jobs
выполняется в подоболочке, будут отображаться только задания этой подоболочки (, в данном случае sleep 1003
).
Теперь, чтобы завершить, нам нужно обратиться к средней части вопроса, вот почему dirs &
(, который действительно работает в подоболочке, как и ( dirs )
), по-прежнему будет показывать каталоги, сохраненные в стеке pushd.
Оказывается, это связано с тем, что оболочка экспортирует список каталогов в специальную переменную-массив DIRSTACK
, которая затем наследуется подоболочками. (Подробнее оDIRSTACK
можно прочитать здесь .)
Один из способов продемонстрировать, как это работает, — использовать pushd
в подоболочке и посмотреть, как это не влияет на стек каталогов исходной оболочки:
$ dirs
~
$ pushd ~/tmp
~/tmp ~
$ ( dirs; pushd / >/dev/null; dirs )
~/tmp ~
/ ~/tmp ~
$ dirs
~/tmp ~
Я считаю, что это должно касаться всех вопросов, о которых вы спрашивали.
ОБНОВЛЕНИЕ:bash имеет специальное положение, позволяющее jobs | less
работать, запуская команду jobs
в текущей оболочке (, чего нет в других встроенных -модулях.)
В коде есть проверка, хранящаяся в переменной jobs_hack
, которая позже проверяется, чтобы заставить ее работать без создания подпрограммы -и разрешить передачу вывода jobs
другой команде.
См. здесь для соответствующей части исходного кода, которая это реализует. (Начиная с bash 4.4)
Вы можете удалить iTunes, чтобы это было исправлено.
Я тоже не пользуюсь iCloud, но он никогда не спрашивал меня о чем-либо . Сделай это:Apple Menu
-->Preferences
-->iCloud
(первый столбец, третья строка для меня)
Убедитесь, что ничего не заполнено, это должно выглядеть так:
Я также не пользуюсь мессенджером Apple, и опять же, он никогда ничего не делал в моей системе. Если вы хотите, вы можете удалить его, открыв каталог приложений и перетащив его в корзину.