Как нам воспроизвести стек в `dirs -v`?

Вы можете написать небольшой фрагмент кода lua , чтобы сделать это за вас. Например, в вашем ~ / .conkyrc :

lua_load /tmp/mylua.lua
TEXT
${lua conky_myfun ${top cpu 1}}

и в файле /tmp/mylua.lua

do
 function conky_myfun(arg)
  local n = conky_parse(arg)
  return math.floor(tonumber(n)+.5)
 end
end

. Это вызывает conky_myfun с заданным аргументом. Функция оценивает аргумент, чтобы получить значение, оно преобразуется в число и округляется до ближайшего целого числа.

0
05.05.2018, 03:18
1 ответ

Проблема в вашем сценарии заключается в том, что ваша awkпрограмма устанавливает первое поле в пустую строку. При этом вы не удаляете его, и поэтому вы получаете пробел (разделитель выходного поля по умолчанию )в качестве первого символа в вашей переменной оболочки path. pushdне может найти каталоги, которые вы ему подаете, из-за пробела в начале имен, и отсюда вы получаете ошибки.

Вместо этого вы можете сделать что-то вроде

sed 's/^[[:blank:]]*[0-9]*[[:blank:]]*//' <"$1" |
while IFS= read -r pathname; do
    pushd "${pathname/#\~\//$HOME/}"
done

sedудаляет все начальные пробелы и цифры в начале строки до того, как readее прочитает.

Как обсуждалось в комментариях :, замена ${pathname/#\~\//$HOME/}заменит тильду только в том случае, если она встречается вместе с /в самом начале $pathname. Для обработки одиночного ~вам, возможно, придется добавить отдельную замену или что-то вроде

case "$pathname" in
    "~")   pathname=$HOME ;;
    "~/"*) pathname=${pathname/#\~/$HOME} ;;
esac
pushd "$pathname"

Если бы входной файл был создан с помощью dirs -l -p, то цикл был бы еще проще:

while IFS= read -r pathname; do
    pushd "$pathname"
done <"$1"
1
28.01.2020, 02:43

Теги

Похожие вопросы