Измените каталог сценария на домашний каталог пользователя в сценарии оболочки
В моем скрипте bash мне нужно изменить текущий каталог на домашний каталог пользователя.
если я хочу перейти на директорию foo home, то из командной строки я могу сделать:
cd ~foo
Что хорошо работает, однако, когда я делаю то же самое из сценария, он говорит мне:
./bar.sh: line 4: cd: ~foo: No such file or directory
Швы, как это было бы так тривиально, но это не работает. В чем здесь проблема? Нужно ли мне избегать "~" или пропущенных кавычек или чего-то еще?
редактировать
когда я говорю " пользователь", я имею в виду не текущего пользователя, который запускает скрипт, а вообще любого другого пользователя в системе.
редактировать
Вот сценарий:
#!/bin/bash
user="foo"
cd ~$user
если имя пользователя жестко, как
cd ~foo
это работает, но если оно находится в пользовательской переменной, то это не так. Что мне здесь не хватает?
4 ответа
Как насчет
cd $(getent passwd foo | cut -d: -f6)
а также
USER=foo
eval cd ~$USER
тоже работает (foo это имя пользователя)
Измените это на:
cd $HOME
На самом деле, я не уверен, почему cd ~whatever
не сработает. Я только что протестировал с небольшим скриптом, и он работал нормально:
#!/bin/bash
cd ~sbright
Я на самом деле получаю то же сообщение об ошибке, что и вы, когда указанный пользователь не существует в системе. Вы уверены (и да, я знаю, что это один из тех вопросов "подключен ли он"), что пользователь существует и у него указан правильный домашний каталог?
Редактировать:
Теперь, когда я вижу, что вы на самом деле делаете... расширение тильды происходит до интерполяции переменных, поэтому вы получаете эту ошибку.
Будет ли скрипт запускаться пользователем? Если это так, вы можете просто сделать:cd ~
Есть ли причина, по которой вы не можете сделать:
#!/bin/bash
cd /home/$USER
Конечно, каталоги не находятся в /home на всех *nixes, но, если вы знаете, для какой ОС / дистрибутива предназначен ваш скрипт, вы должны быть в состоянии найти что-то, что работает достаточно хорошо.