2011-12-31 3 views
0

Как объединить эти два примера с pushd и whoami для изменения каталога?Bash script получить пользователя и изменить dir

Я знаю, что я могу изменить директорию, как это:

#!/bin/bash 
pushd /home/mike/Pictures > /dev/null 
# do something in the new dir 
ls 
popd > /dev/null 

И я знаю, что могу получить имя пользователя, как это:

#!/bin/bash 
theuser=`whoami` 
echo $theuser   
+1

Э-э ... изменить его к чему? –

+0

Вам действительно не нужно 'whoami', если я правильно понимаю ваш запрос. Просто 'pushd -n ~/Pictures' будет делать. – chrisaycock

ответ

0

Эти обратные кавычки могут быть использованы для интерполирования выход из которые они содержат в другом:

pushd /home/`whoami`/Pictures 
+2

Используйте '$ (...)' вместо обратных кавычек. Это особенно ценно, если вам нужно вложить конструкцию (что здесь не так). –

+0

Спасибо rkb, я сделал перерыв, потом вернулся и использовал ваш вариант. Мне все еще нужны правильные ''/dev/null' и 'popd>/dev/null'? – mike

+0

Перенаправление stdout в/dev/null скроет нормальный вывод этих команд ... так что если это то, чего вы хотите, тогда вам все равно нужны.) И popd, чтобы вернуться в каталог, в котором вы были раньше. Здесь много хороших ответов, в зависимости от того, что вам действительно нужно делать с вашим скриптом. – rkb

0

Гораздо проще, чем использовать pushd и popd, запустите команду в суб-оболочки:

(
cd /home/$(whoami)/Pictures && 
ls 
) 

Суб-оболочка изменяет каталог, не затрагивая основной процесс - именно так, как вы хотели, но гораздо более надежно.

0

Bash уже имеет переменную $ USER, не нужно вызывать внешний бинарник

pushd /home/$USER/Pictures > /dev/null 
+0

Если я иду с этим, мне все равно нужен 'popd>/dev/null'? Наверное, я не совсем понимаю, что он делает. – mike

+0

Если вы используете это как обычный скрипт (т. Е. Его исполняемый файл, он начинается с «#!», И вы запускаете его с именем файла NOT '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ') Это означает, что когда он делает 'cd', * subshell * cd в этом каталоге, но * ваша * оболочка остается в том месте, где она была; когда подоболочка выходит, не имеет значения, где она была cd'd.Обратите внимание, что ответ @Jonathan Leffler можно использовать, чтобы заставить подоболочку, если это не работает как обычный скрипт, или что-то нужно сделать в исходном каталоге после 'ls'. –

1

Это проще всего использовать cd изменить каталог:

#!/bin/bash  
cd ~/Pictures 
3

Ты waaay overthinking it ...

cd ~/Pictures 

EDIT:

На самом деле, нет. То, что вы на самом деле хочу:

cd "$(xdg-user-dir PICTURES)" 
+0

+1 для успешной дистилляции того, что ему нужно. – benesch

+0

Ignacio, вы знаете, если xdg-user-dir по умолчанию используется в Ubuntu natty? Я имею в виду новую установку после применения обновлений безопасности, но перед применением каких-либо рекомендуемых обновлений? Chrisaycock, я прочитал человека для pushd, но я все еще не понимаю вариант -n. Что делать, если я хочу создать новый каталог после смены каталогов? Мне нужно было бы опустить -n правильно? – mike

+0

@mike: Я не * определенно *, но на всякий случай вы могли бы поместить результат в переменную и использовать замену параметров, чтобы заменить '~/Pictures', если он пуст. –

0

Среди других решений:

pushd "$HOME/Pictures" 

В конце концов, ничто не обязывает домашний каталог носить имя пользователя!