Sự khác biệt giữa $ (Hoài) và `Sự` trong Bash


2

Tôi đã nhận được kết quả mong đợi với `...`, nhưng thất bại với $ (...)

kill $(ps ux | grep S..\.tcl | grep -v grep | awk '{print $2}')

Illegal variable name.

kill `ps ux | grep S..\.tcl | grep -v grep | awk '{print $2}'`

(kill expected processes)

Bằng cách googling, tôi thấy một số người nói rằng họ có thể hoán đổi cho nhau, nhưng nó không phải là ví dụ này. Vậy, sự khác biệt giữa $ (...) và `...` trong Bash là gì?


2
Tôi không nhận được lỗi đó khi tôi chạy lệnh trên của bạn, nó sẽ hoạt động như được viết bằng $ ().
ChasingLogic

1
Tôi cũng không nhận được lỗi. Một khả năng là tập lệnh không thực sự chạy dưới bash. Bạn có thể cung cấp chi tiết về hệ điều hành bạn đang sử dụng, cách bạn đang thực thi tập lệnh và phiên bản shell không?
John1024

Câu trả lời:


7

Tôi đã làm một

grep -al 'Illegal variable name' /bin/*

và tìm thấy thông báo trong / bin / csh. Có vẻ như bạn đang chạy csh không bash khi bạn đang ra lệnh. ví dụ:

csh $ echo `echo abc`
abc
csh $ echo $(echo abc)
Illegal variable name.

1
Đây là câu trả lời chính xác. cshkhông phải là vỏ bourne! Quy tắc trích dẫn và chức năng liên quan của nó là hoàn toàn khác nhau. Nếu bạn đang sử dụng csh, đừng hy vọng mọi thứ sẽ hoạt động theo cách họ làm việc trong bash (hoặc, đối với vấn đề đó, hoạt động hoàn toàn; cshthật kinh khủng)
Wouter Verhelst

Oh! Cảm ơn rất nhiều! Tôi không biết tại sao tôi đã thử nghiệm chúng trong csh / tcsh và tôi đã không tìm thấy điều đó. Ngoài ra, tôi không biết chuỗi đầu ra trong shell có thể được tìm thấy bằng grep.
Arton

-1

Một số giải thích về backtick (`) cũng được gọi là thay thế lệnh:

https://unix.stackexchange.com/questions/27428/what-does-backquote-backtick-mean-in-commands

https://stackoverflow.com/questions/4708549/whats-the-difference-b between-command-and-common-in-shell-lập trình

Trong bash (git-bash) tôi cũng thu được các kết quả khác nhau. Chạy tập lệnh trong một tệp, nói /c/pathToScript/test.sh

#!/bin/bash
WORK_DIR=/c/myWorkingDirPath;
cd $WORK_DIR;
if [ `pwd` != $WORK_DIR ]; then
  echo "Oh my... "; # `pwd` returns /c/pathToScript 
fi
if [ $(pwd) != $WORK_DIR ]; then
  echo "Thank Goodness... "; #$(pwd) returns /c/myWorkingDirPath
fi

$ (Pwd) hoạt động trong lớp con được tạo khi tôi chạy tiến trình.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.