Вы можете просто создавать новую оболочку для каждого xargs:
find. -name "file*" | xargs -n 1 sh -c 'echo "$1"; find. -samefile "$1" | wc -l' xargs-sh
Хотя использование xargs
здесь — плохая идея, так как это приведет к поломке, если пути к файлам содержат пробелы или символы в кавычках.
Здесь использование wc -l
также является ненадежным, поскольку оно ломается, если пути к файлам содержат символы новой строки.
Вы можете использовать стандартный синтаксис find -exec cmd {} +
и избежать необходимости запускать один sh
для каждого файла с помощью цикла:
find. -name "file*" -exec sh -c '
for file do
printf "%s\n" "$file"
find.//. -samefile "$file" | grep -c //
done' find-sh {} +
DBUS_SESSION_BUS_ADDRESS
необходимо установить как переменную окружения. Его правильное значение можно установить с помощью следующего сценария, взятого из этого вопроса с вопросом Как изменить Gsettings через удаленную оболочку?
#!/bin/bash
# Remember to run this script using the command "source./filename.sh"
# Search these processes for the session variable
# (they are run as the current user and have the DBUS session variable set)
compatiblePrograms=( nautilus kdeinit kded4 pulseaudio trackerd )
# Attempt to get a program pid
for index in ${compatiblePrograms[@]}; do
PID=$(pidof -s ${index})
if [[ "${PID}" != "" ]]; then
break
fi
done
if [[ "${PID}" == "" ]]; then
echo "Could not detect active login session"
return 1
fi
QUERY_ENVIRON="$(tr '\0' '\n' < /proc/${PID}/environ | grep "DBUS_SESSION_BUS_ADDRESS" | cut -d "=" -f 2-)"
if [[ "${QUERY_ENVIRON}" != "" ]]; then
export DBUS_SESSION_BUS_ADDRESS="${QUERY_ENVIRON}"
echo "Connected to session:"
echo "DBUS_SESSION_BUS_ADDRESS=${DBUS_SESSION_BUS_ADDRESS}"
else
echo "Could not find dbus session ID in user environment."
return 1
fi
return 0
Затем задание cron можно изменить на это:*/10 * * * * DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus /home/me/Pictures/wallpapers/switcher.sh >> /home/me/Logs/wallpaper.log 2>&1