У меня есть проблема, я хотел бы передать по каналу ls и CD вместе. Я создаю канал оболочки как:
cesta = ls -lat | awk 'NR==2 {print $8"/"}'
cd $cesta
Но это не работает.Вы не могли бы мне помочь. И я не получил ошибки. Filip
Существует несколько проблем с тем, чего Вы делаете попытку. В первую очередь, для устанавливания значения переменной у Вас не может быть пробелов вокруг =
. Затем для получения вывода команды, Вам нужны или обратные галочки, или предпочтительно $()
.
Последнее и наиболее важное, Вы не должны анализировать ls
, очень трудно преуспеть и чрезвычайно подверженный ошибкам. Ваш подход повредится, если Ваше имя каталога будет содержать пространство, например. В примерах ниже, что 8th
поле?
$ ls -l
total 0
-rw-r--r-- 1 terdon terdon 0 Nov 11 14:59 file1
-rw-r--r-- 1 terdon terdon 0 Nov 11 2013 file2
-rw-r--r-- 1 terdon terdon 0 Nov 11 15:00 file 2
-----
|--------> 8th field
файл/имя каталога мог бы быть 9-м полем, или это могли бы быть 9-е и 10-е поля, или еще больше. Плюс, формат даты может измениться между локалями. В основном использование ls
для этого является ужасной идеей. Вместо этого используйте stat
и вид ко времени:
$ cesta=$(stat --printf "%X\t%n\n" * | sort -nk1,1 | cut -f 2- | awk 'NR==2')
$ cd "$cesta"
Каков вывод Вашей команды?
ls -lat | awk 'NR==2 {print $8"/"}'
В моем случае у меня был час того, когда каталог был создан.
замена команды Using это работало на меня:
$ ABCD=`ls -lat | awk 'NR==2 {print $9"/"}'`
$ cd $ABCD
$ pwd
$ /home/myuser_name/.gconfd
С наилучшими пожеланиями, Hugo.