Выбор заголовка вашего вопроса немного сбивает с толку.
pushd
/ popd
, функция csh
, скопированная с помощью bash
и zsh
, представляют собой способ управления стеком. запоминаемых каталогов.
pushd /some/dir
помещает текущий рабочий каталог в стек, а затем изменяет текущий рабочий каталог (и затем печатает / some / dir
, за которым следует содержимое этот стек (разделенный пробелами).
popd
печатает содержимое стека (опять же, разделенное пробелом), а затем переходит к верхнему элементу стека и выталкивает его из стека.
(также имейте в виду, что некоторые каталоги будут будут представлены там с их нотацией ~ / x
или ~ user / x
).
Итак, если стек в настоящее время имеет / a
и / b
, текущий каталог - / здесь
, и вы работаете:
pushd /tmp/whatever
popd
pushd
напечатает / tmp / something / here / a / b
и popd
выведет / здесь / a / b
, а не / tmp / something
Независимо от того, используется ли подстановка команд или нет. popd
не может быть использован для получения пути к предыдущему каталогу, и, как правило, его вывод не может быть обработан постобработкой (см. Массив $ dirstack
или $ DIRSTACK
некоторые оболочки, хотя для доступа к элементам этого стека каталогов)
Может быть, вы хотите:
pushd "$(mktemp -d)" &&
popd &&
rmdir "$OLDPWD"
Или
cd "$(mktemp -d)" &&
cd - &&
rmdir "$OLDPWD"
Хотя я бы использовал:
tmpdir=$(mktemp -d) || exit
(
cd "$tmpdir" || exit # in a subshell
# do what you have to do in that tmpdir
)
rmdir "$tmpdir"
В любом случае, pushd "$ (mktemp -d ) "
не запускает pushd
в подоболочке. В противном случае он не смог бы изменить рабочий каталог. Это mktemp
, работающий в подоболочке. Поскольку это отдельная команда, она должна выполняться в отдельном процессе. Он записывает свой вывод в канал, а процесс оболочки читает его на другом конце канала.
ksh93 может избежать отдельного процесса, когда команда встроена, но даже там это все еще подоболочка (другая рабочая среда), которая на этот раз эмулируется, а не полагается на отдельную среду, обычно обеспечиваемую разветвлением. Например, в ksh93
, a = 0; echo "$ (a = 1; эхо-тест)"; echo "$ a"
, форк не задействован, но все же echo "$ a"
выводит 0
.
Здесь, если вы хотите сохранить вывод mktemp
в переменной, одновременно с передачей его в pushd
с помощью zsh
, вы можете:
pushd ${tmpdir::="$(mktemp -d)"}
С другими оболочками типа Борна:
unset tmpdir
pushd "${tmpdir=$(mktemp -d)}"
Или использовать вывод $ (mktemp -d)
несколько раз без явного сохранения его в переменной, вы можете использовать zsh
анонимные функции:
(){pushd ${1?} && cd - && rmdir $1} "$(mktemp -d)"
Конфигурационный файл не подхватывался, поскольку, по-видимому, необходимо иметь числовой префикс для файлов, размещенных в каталогах conf.d
, например.
~/.config/fontconfig/conf.d/10-dropbox-fonts.conf
работает, а ~/.config/fontconfig/conf.d/dropbox-fonts.conf
- нет.
Ведущие 10-
в имени файла делают разницу.