GNU/Linux >> Belajar Linux >  >> Linux

Apa yang dihasilkan pwd?

Ada tiga "direktori" independen yang dimainkan di sini:

  1. direktori kerja shell Anda saat ini,
  2. direktori kerja skrip shell saat ini, dan
  3. direktori yang berisi skrip shell.

Untuk menunjukkan bahwa mereka independen, Anda dapat menulis skrip shell, disimpan ke /tmp/pwd.sh, berisi:

#!/bin/sh
pwd
cd /var 
pwd

Anda kemudian dapat mengubah pwd Anda (#1 di atas) ke /:

cd /

dan jalankan skrip:

/tmp/pwd.sh

yang dimulai dengan mendemonstrasikan pwd yang ada (#1), lalu mengubahnya menjadi /var dan menampilkannya lagi (#2). Tak satu pun dari pwd itu adalah "/tmp", direktori yang berisi /tmp/pwd.sh (#3).


Direktori Kerja Sekarang (atau Saat Ini)

Apakah perintah pwd dalam skrip shell mengembalikan direktori tempat skrip shell berada?

Tidak.

Pertama, menurut definisi, tidak ada skrip shell atau perintah shell yang mengembalikan apa pun selain status keluar numerik antara 0 - 255. Itu aksiomatik, tetapi secara umum bukan maksud orang-orang ketika mereka menanyakan jenis pertanyaan ini.

Kedua, pwd adalah builtin Bourne shell dan sistem biner standar. Salah satu mencetak direktori kerja saat ini logis atau fisik , yang umumnya:

  1. Lokasi Anda dalam struktur direktori saat Anda memanggil skrip atau biner.
  2. Lokasi Anda saat ini setelah mengubah direktori kerja dengan cd atau utilitas dan bawaan lain yang mengubah direktori kerja saat ini seperti pushd atau popd.

Jika Anda menginginkan direktori skrip saat ini, gunakan dirname utilitas seperti yang dijelaskan pada bagian terakhir di bawah ini.

Uji Cepat pwd

Sebagai tes cepat untuk melihat apa pwd benar-benar mencetak, Anda dapat menjalankan yang berikut:

# Create a shell script containing pwd.
cat <<-EOF > /tmp/test_pwd.sh
#!/bin/sh

pwd
EOF

# Make the script executable.
chmod 755 /tmp/test_pwd.sh

# Go somewhere on the filesystem, and call the test script.
cd /etc
/tmp/test_pwd.sh

Ini akan mencetak /etc , bukan /tmp , karena direktori kerja Anda saat ini adalah /etc . Ini adalah perilaku yang diharapkan.

Mendapatkan Direktori yang Berisi Skrip

Anda mungkin mengajukan pertanyaan ini karena Anda ingin menemukan direktori skrip saat ini. Dalam kasus umum, berikut ini adalah solusi cepat dan kotor:

#!/usr/bin/env bash
echo $(dirname "$0")

Ini berfungsi karena $0 umumnya berisi nama jalur yang digunakan untuk menjalankan skrip yang sedang dieksekusi, dan ekspansi shell menggunakan dirname utilitas untuk mengembalikan jalur tidak termasuk bagian nama file. Anda dapat melakukan hal serupa, tetapi kurang mudah dibawa, dengan perluasan parameter Bash "${0%/*}" .

Ini semua adalah penyederhanaan yang berlebihan, tentu saja. Harap baca manual Bash (terutama bagian tentang parameter posisi, parameter khusus, dan BASH_SOURCE ) dan halaman manual untuk readlink dan realpath untuk mendapatkan pemahaman yang lebih lengkap tentang kasus tepi, yang ada beberapa di antaranya.

Namun, dalam skrip sehari-hari, komponen direktori $0 cukup untuk memberi tahu Anda apa yang ingin Anda ketahui. Jika Anda melakukan sesuatu yang cukup rumit di mana $0 tidak menyimpan informasi yang sebenarnya Anda butuhkan, dan Anda memerlukan konstruksi yang lebih rumit seperti:

echo $(dirname "$(realpath "$0")")

maka Anda mungkin membuat hidup Anda lebih sulit dari yang seharusnya.


pwd mengembalikan 0 kecuali direktori kerjanya saat ini tidak dapat dibuka.

mkdir /tmp/d; cd "$_"
pwd && pwd -P; echo "$?"
rmdir ../d
pwd && pwd -P; echo "$?"
/tmp/d
/tmp/d
0
/tmp/d
pwd: error retrieving current directory: getcwd: cannot access parent directories: No such file or directory
1

Linux
  1. Apa yang Dilakukan "lc_all=c"?

  2. Apa Arti Ukuran Direktori Dalam Output Perintah 'ls -l'?

  3. Pwd Tanpa Symlink?

  1. Apa Artinya Dalam Keluaran Dari Ps?

  2. Apa Arti Keluaran Dari Xev Ini?

  3. Apa yang Digema $? Mengerjakan??

  1. Apa yang Dikembalikan Perintah Ls -al .*?

  2. Apa yang dikembalikan malloc(0)?

  3. Apa artinya 'cd -'?